把一个含有N个元素的数组循环右移K位

2018-10-18  本文已影响21人  高思阳

普通解法: 可以每次将数组中的元素右移一位,循环K次。每个元素右移N位后都会回到自己的位置上。因此,如果K > N,右移K-N之后的数组序列跟右移K位的结果是一样的。进而可得出一条通用的规律:右移K位之后的情形,跟右移K’= K % N位之后的情形一样。

高级解法(线性时间):假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位(即右移K = K % N位)的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成:

<左移同理,将左移位数个左边元素逆序排列,将剩下的右边元素逆序排列,然后全部逆序即可得到最终数组>

void reverse(NSMutableArray *arr, NSInteger lo, NSInteger hi)
{
for (NSInteger i = lo,j = hi; i<j; i++,j--) {
NSObject *num = arr[i];
arr[i] = arr[j];
arr[j] = num;
}
}

int main(int argc, const char * argv[]) {
@autoreleasepool {

    NSMutableArray *arr = [NSMutableArray arrayWithObjects:@(1),@(2),@(3),@(4),@(5),@(6), nil];
    
    NSInteger k = 1;
    k = k%arr.count;
    
    if (k!=0) {
        reverse(arr,0,arr.count-k-1);
        reverse(arr,arr.count-k,arr.count-1);
        reverse(arr, 0, arr.count-1);
    }

    NSLog(@"%@",arr);
}
return 0;

}

上一篇 下一篇

猜你喜欢

热点阅读