问题描述:

设计一个算法,把一个含有N元素的数组循环左移或者右移K位。

解决方法:

1. 暴力解法------O(KN)

2. 颠倒位置------O(N)

具体思路和代码:

1. 暴力解法------O(KN)

思路:循环K次,每次移动一位

代码:

 1 //右移
 2 void s1(int A[], int n, int k)
 3 {
 4     k = k % n;
 5     for(int i = 0; i < k; i++)
 6     {
 7         int t = A[n-1];
 8         for(int j = n-1; j > 0; j--)
 9         {
10             A[j] = A[j-1];
11         }
12         A[0] = t;
13     }
14 }

 1 //左移
 2 void s3(int A[], int n, int k)
 3 {
 4     k = k % n;
 5     for(int i = 0; i < k; i++)
 6     {
 7         int t = A[0];
 8         for(int j = 1; j < n; j++)
 9         {
10             A[j-1] = A[j];
11         }
12         A[n-1] = t;
13     }
14 }

2. 颠倒位置------O(N)

思路:

例如:1 2 3 4 5 6 7 8 右移2位

3 4 5 6 7 8 1 2

我们分解下: 先对换(0, n-k-1) :1 2 3 4 5 6 -> 6 5 4 3 2 1

再对换 (n-k, n-1):7 8 -> 8 7

-> 6 5 4 3 2 1 8 7

       整体对换:7 8 1 2 3 4 5 6

代码:

 1 //右移
 2 void reverse(int A[], int l, int r)
 3 {
 4     for(int i = l, j = r; i < j; i++, j--)
 5     {
 6         int t = A[i];
 7         A[i] = A[j];
 8         A[j] = t;
 9     }
10 }
11
12 void s2(int A[], int n, int k)
13 {
14     reverse(A, 0, n-k-1);
15     reverse(A, n-k, n-1);
16     reverse(A, 0, n-1);
17 }

1 //左移
2 void s4(int A[], int n, int k)
3 {
4     reverse(A, 0, k-1);
5     reverse(A, k, n-1);
6     reverse(A, 0, n-1);
7 }

转载于:https://www.cnblogs.com/panpannju/p/3733204.html

编程之美2.17 数组循环移位相关推荐

  1. 编程之美2.17 数组循环移位

    这是一个很经典的题目,题目的大概意思是这样的:       有一个存储字符串的数组,需要按照要求循环移动数组中的字符,例如,数组中存储字符 abcd1234,循环右移4位,之后,会得到这样一个字符数组 ...

  2. c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度

    改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...

  3. 编程之美2.10:寻找数组中的最大值和最小值

    编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...

  4. 编程之美2.1 求二进制中1的个数

    最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...

  5. 2017“编程之美”终章:AI之战勇者为王

    编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...

  6. Java 并发编程之美:并发编程高级篇之一-chat

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  7. Java 并发编程之美:并发编程高级篇之一

    借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...

  8. 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)

          首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况.       想起来这个问题也不是很难,我们可以求解一维矩阵 ...

  9. 编程之美2.14 求数组的子数组之和的最大值

          这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的.       解题思想也不是很难,我熟悉的有:两种解题办法:   ...

最新文章

  1. 循环for语句 if语句
  2. 你应该在开始API开发之前知道的事(下)(翻译)
  3. 前端错误信息收集(errorEruda)解析
  4. Ganglia 应用实践
  5. [Unity] 3D数学基础 - 坐标系、向量、矩阵
  6. springboot使用ImportBeanDefinitionRegistrar 动态注册bean
  7. 怎么查看usb读取信息_电脑弹出USB设备时提示该设备正在使用中的解决方法
  8. findler mac 隐藏文件_fiddler使用实例之----------查找隐藏的真实地址!!!!
  9. python编程100个小程序-整理了适合新手的20个Python练手小程序
  10. edui 富文本编辑_ueditor集成秀米编辑器
  11. 论文中的CNN网络绘制软件
  12. vhs预设_vhs vs beta原始格式大战的故事
  13. Excel快速下拉填充序列至10000行
  14. 14.嵌入式控制器EC实战 SMBus读取电池信息并控制充放电
  15. hevc编码merge 模式
  16. 设置Windows控制台颜色
  17. CentOS禁止Ping方法
  18. 多线程(二)互斥锁详解
  19. 大连暗泉渗透/红队岗面试题(高级渗透测试工程师面试题)总结
  20. Python 计算思维训练——输入和错误处理练习(二)第三关

热门文章

  1. python类方法需要传入cls参数_如何从Python 3.x中的类定义传递参数到元类?
  2. php 过滤注释,PHP过滤html注释
  3. access中主键自动增长_ACCESS与EXCEL融合应用系列(一) :把数据导入Access
  4. php怎么将网页另存为mht代码,mht转html代码(php)
  5. oracle连接eclipse的包,【求助】eclipse导入了Oracle的驱动包连不上Oracle
  6. Spring @PropertySource
  7. Python SHA1算法
  8. scrapy item.py
  9. clang mingw
  10. opencv-api filter2D