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

普通解法: 可以每次将数组中的元素右移一位,循环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;

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 9,189评论 0 2
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 8,587评论 0 9
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一...
    阿里高级软件架构师阅读 8,566评论 0 19
  • 已婚男子王先生称,他与李女士谈恋爱期间,以李女士的名义租赁了一家台球厅。不久,李女士发现王先生已经结婚,遂与其分手...
    小好阅读 1,832评论 0 1
  • 人来的时候的是孤单的,在这世间走上一遭也是孤单的,当遇见困境的的时候,不要想着有谁来拉你一把,最好咬咬牙,大步向前...
    小星同学_1fe2阅读 1,000评论 0 0

友情链接更多精彩内容