算法-约瑟夫环

有一个数组a[n]顺序存放0~n-1,要求每隔step个数删掉一个数,到末尾时循环至开头继续进行,求最后一个被删掉的数的原始下标位置。以8个数(N=7)为例:{0,1,2,3,4,5,6,7},0->1->2(删除)->3->4->5(删除)->6->7->0(删除),如此循环直到最后一个数被删除。

//n :总数  step:步长
- (int)func:(int)n step:(int)step {
    //数组:0,1,2,3,4,5,6
    NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i < n; i++) {
        [array addObject:[NSNumber numberWithInt:i]];
    }
    int stepFlag = 0;//步长计数
    int currentSize = n;//当前数组有效长度
    NSNumber *DELETE = @(-1);//删除标识位
    int lastDeleteIndex = 0;//最后被删除的元素下标
    int i = 0;//循环下标
    while (currentSize != 0) {
        //没到最后一直循环
        if (array[i] != DELETE){//判断当前元素是否等于删除标志
            if (stepFlag ++ == step) {
                array[i] = DELETE;
                lastDeleteIndex = i;
                currentSize --;
                stepFlag = 0;
            }

        }
        i = (i+1)%n;
    }
    return lastDeleteIndex;
}

你可能感兴趣的:(算法-约瑟夫环)