数组循环向左移动k位的算法, 我在课本上只看到了方法一,暂且称为颠倒交换法, 方法二是我自己想出来的,暂且称为循环赋值法.

方法一:颠倒交换法

算法描述:循环左移k位, 先把前面 0 到 k-1位置的数字首尾交换, 然后再把 k 到 len-1位置首尾交换, 最后再把 0 到 len-1下标位置首位交换即可实现, 这里的原理你可以画个例子就懂了

代码:

int a[100]; //数组是全局变量//输出0到len位置的元素
void show(int len){for(int i=0;i<len;i++){printf("%d ",a[i]);}
}//首尾交换的函数
void reverse(int left,int right){int i=left,j=right;while(i<j){int t = a[i];a[i] = a[j];a[j] = t;i++;j--;}
}//方法一:颠倒交换法
void fun1(int len,int k){int i=0;for(i=0;i<len;i++)a[i] = i;reverse(0,k-1);reverse(k,len-1);reverse(0,len-1);show(len); //输出len长度的数组printf("\n\n");
}

方法二:循环赋值法

这个方法是我自己想出来的, 也很感谢@木落兮帮我指正的错误, 如果还有错误的地方, 欢迎各位评论指正错误
算法描述:

  • 情况1:针对len%k!=0
    举个例子,len=5, k=3时 画个图把代码走一遍,看下面的图
  • 情况2 针对len%k==0
    让count用来计数循环的趟数, 比如 len=10, k=2 时,count范围从0~1 循环两次
    内层循环 使用 i 和 j 来循环赋值,当回到count下标位置时,这一趟赋值完成,继续下一趟

综上所述,这个算法循环了k趟, 每趟循环 len/k 次, 时间复杂度O(n), 空间复杂度O(1)

代码:

//方法二: 循环移动法
void fun2(int len,int k){int i;for(i=0;i<len;i++)a[i] = i;int j,temp = a[0];i=0;if(len%k!=0){  //情况一:如果len不是k的整数倍int temp = a[0];while(true){j = (i+k)%len; //j取i后面的k+i位置,如果超出范围,则取余if(j==0) //如果循环一大圈,则说明已经赋值完成了就break,但是这个方法针对len%k==0的情况失效,所以while循环套在if判断里面break;a[i] = a[j];i = j;}a[i] = temp;}else{ //情况二:如果len是k的整数倍,由于上述情况不能适用于整数倍的情况for(int count=0;count<k;count++){ //循环k趟i = count;temp = a[i]; //记录开始的位置while(true){j = (i+k)%len;if(j==count) break; //回到这个位置时,则跳出循环a[i] = a[j];i = j;}a[i] = temp;} //end for} //end ifshow(len); //输出len长度的数组}

附录:方法二的修改版, 压缩为一个循环

算法描述:
当len=8, k=2时, 如图


void fun3(int len,int k){int i;for(i=0;i<len;i++)a[i] = i;int j , temp = a[0];i=0;int count = 0; //循环的趟数,循环k次int pos = 0; //标记每趟循环开始的位置while(true){j = (i+k)%len;if(j<k && ++count==k) //标记循环的趟数,超过k次,则跳出循环break;if(j==pos){  // 如果j与pos重合,就说明是len%k==0的情况,则让a=j+1,再来一趟循环a[i] = temp;i=j+1;temp = a[i];pos = i; //标记这一趟开始的位置continue; //跳过下面两行代码}a[i] = a[j];i = j;} //end whilea[i] = temp; //这一句代码针对len%k!=0的情况,让最后一个位置赋值show(len); //输出len长度的数组
}

如果你觉得算法有待改进的地方, 可以在下面评论。

数组循环向左移动k位的算法相关推荐

  1. 数组:如何把一个数组循环右移K位

    问题描述: 假设要把数组12345678右移2位,变为78123456. 分析: 方法一: 比较移位前后数组序列的形式,不难看出,其中有两段序列的顺序是不变的,即就是 78 和 123456, 可以把 ...

  2. c语言将数组元素循环右移k位,把一个含有N个元素的数组循环右移K位

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

  3. 剑指offer:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。

    汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S="abc ...

  4. c语言 数组循环左移m位

    #include<stdio.h> //函数原型 void rightshiftleft(int *p_num,int n,int m); void enterint(int *p_num ...

  5. 1008 数组元素右移k位

    传送门:https://pintia.cn/problem-sets/994805260223102976/problems/994805316250615808 第一种解法:这种解法非常巧妙,不是直 ...

  6. 【步步惊心】数组循环右移

    设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量. 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次.abcd ...

  7. 典型的Top K算法_找出一个数组里面前K个最大数

    原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...

  8. 长度为n的整数数组循环左移右移m位

    长度为n的整数数组循环左移m位 右移m相当于左移n-m // pat.cpp : Defines the entry point for the console application. //#inc ...

  9. 每天一道LeetCode-----有序数组循环右移n位后,寻找最小值,数组中可能包含重复元素

    Find Minimum in Rotated Sorted Array II 原题链接Find Minimum in Rotated Sorted Array II 一个有序数组循环右移n位,找到右 ...

最新文章

  1. python12306抢票犯法_Python实例 2-12306抢票(一) 登陆
  2. 事件标志组的原理与创建
  3. weblogic12 linux部署,linux系统中安装部署weblogic12.1.3
  4. 单片机c语言程序设计叶俊明,单片机C语言程序设计
  5. Navigator 对象,能够清楚地知道浏览器的相关信息
  6. openjdk 使用_如何在OpenJDK中使用ECC
  7. LeetCode 399. 除法求值(图的DFS搜索)
  8. [Ext JS6]视图模型和数据绑定
  9. 充值,提现功能涉及的多线程、队列问题
  10. java MD5 32位加密
  11. yxy小蒟蒻的201113总结
  12. 计算机发邮件试题,计算机考试题库:计算机网络模拟练习题(4)
  13. 什么是node.js
  14. php tp 聚合数据接口,TP5结合聚合数据天气预报API查询天气
  15. c语言项目实战 —— 图书管理系统
  16. 手机移动端视频全屏播放(兼容Android与iOS)
  17. Bing必应搜索是什么?
  18. jquery-day32
  19. 观国庆60周年庆典阅兵式有感
  20. Installation Oracle11gR2 RAC on SuSE Linux Enterprise Server 11

热门文章

  1. VirtualAPP技术应用及安全分析报告
  2. Linux进程描述符task_struct结构体
  3. linux 多播路由查看,Linux下多播路由的实现Windows系统 -电脑资料
  4. Foundry教程:使用多种方式编写可升级的智能代理合约(下)
  5. 苹果ipad怎么用计算机来唱歌,‎App Store 上的“唱歌-教您怎么唱歌”
  6. 0x0B-HackTheBox-Obscurity
  7. win10时间服务器未运行,win10 Windows License Manager Service服务未运行如何解决
  8. python 英文语义分析_spinrewriter英文伪原创工具,Python对接API示例
  9. “用户名不在 sudoers文件中,此事将被报告” 解决方案
  10. Field baseMapper in com.xxx required a single bean,but 100 were found --------Mybatis-Plus