美文网首页
把一个含有N个元素的数组循环右移K位

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

作者: 高思阳 | 来源:发表于2018-10-18 13:40 被阅读21次

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

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

  • 逆序排列abcd:abcd1234 → dcba1234;
  • 逆序排列1234:dcba1234 → dcba4321;
  • 全部逆序:dcba4321 → 1234abcd。

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

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;

}

相关文章

  • 数组循环移位

    设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。1、简单的...

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

    普通解法: 可以每次将数组中的元素右移一位,循环K次。每个元素右移N位后都会回到自己的位置上。因此,如果K > N...

  • 189.Rotate Array

    189. Rotate Array 总结: 让数组右移K位 **解法: ** 1.循环替换 描述: 从第一个元素开...

  • 数组循环问题

    自测-3 数组元素循环右移问题一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移...

  • 1008. 数组元素循环右移问题

    原题链接数组元素循环右移问题: 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向...

  • 1008

    //1008 数组元素循环右移问题 (20)(20 分)//一个数组A中存有N(N>0)个整数,在不允许使用另...

  • 数组元素循环右移

    将一个int[]型数组右移k位,要求最小的空间占用。 一个数组A中存有N(N>0)个数, 在不允许使用任何另外数组...

  • 将数组元素循环移动p位,交换次数仅为n次

    算法思路 循环左移p位 数组序列长度为n,左移p位。 算法步骤 代码如下: 循环左移p位 数组序列长度为n,右移p...

  • PAT B1008 数组元素的夹空格输出

    1008 数组元素循环右移问题 (20 分)一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个...

  • [PAT (Basic Level) Practice]1008

    1008 数组元素循环右移问题 (20 分) 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每...

网友评论

      本文标题:把一个含有N个元素的数组循环右移K位

      本文链接:https://www.haomeiwen.com/subject/wrnjzftx.html