这是一个很经典的题目,题目的大概意思是这样的:

      有一个存储字符串的数组,需要按照要求循环移动数组中的字符,例如,数组中存储字符 abcd1234,循环右移4位,之后,会得到这样一个字符数组 1234abcd,当然,左移也是同样的解法

      想想这个问题不是很难,顺序依次移动就可以了,这样做的话,时间复杂度是O(n2)量级的,那么,有没有更快的方法呢?

      首先,我们需要对数组的前四位进行翻转(前面的例子),得到dcba1234,之后,我们再对后4位进行翻转,得到dcba4321,最后,我们再对整体进行翻转,得到:1234abcd,就是这样,解决了这个问题,由于翻转一个字符串需要的时间复杂度是O(n),所以,该算法的时间复杂度是O(n)量级的。

      下面给出解决方法:      

template <typename T>
void DutCircleShift(T* A, int size, int k)
{k %= size;DutReverse<T>(A, 0, size - k - 1);DutReverse<T>(A, size - k, size - 1);DutReverse<T>(A, 0, size - 1);
}
/*翻转函数*/
template <typename T>
void DutReverse(T* A, int low, int high)
{for (; low < high; ++low, --high){T temp = A[low];A[low] = A[high];A[high] = temp;}return;
}

代码中的第一句代表如果输入的那个数(即循环移动的数字)大于数组的长度,那么,就对这个数按照数组长度取余。

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

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

    问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法----- ...

  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. 防抖技术 | OpenCV实现视频稳流
  2. 分布式计算的模式语言读后感
  3. Go netpoller 网络模型之源码全面解析
  4. KVO 和 KVC 的区别?
  5. linux关闭自检测进程,CentOS下自动发邮件检测某进程是否存在
  6. 福利网站!程序员面试——算法工程师面试大全第三部分
  7. 如何使用iMovie对抖动视频进行防抖处理?
  8. 增加window服务器,Windows Server2012入门-添加服务器角色和功能
  9. MyBatis动态代理执行原理
  10. 2014Esri全球用户大会——亮点系列之精彩应用案例
  11. 企业微信绑定企业邮箱服务器配置,企业微信企业邮箱开通规则说明介绍
  12. Schneider TM200CE40U 通讯与编程
  13. 贴片二极管正负极如何区分
  14. 利用“栈”快速计算——逆波兰表达式
  15. 如何群发邮件?教你发邮件时文件怎么命名、如何设置邮件格式,一文解决你的疑惑
  16. NLP 文本分词 java类方法,及opennlp 示例
  17. 计算机固态加机械硬盘,在台式机中添加固态/机械硬盘驱动器,让我与这篇文章一起教你...
  18. 百度啊,你是新年第一惨
  19. 3月18日 稠密光流FB,Deepflow,DIS,光流场的可视化
  20. (开源)一款可以发文字发图片的实时聊天微信小程序,可以滚动内容到底部

热门文章

  1. asp.net夜话之九:验证控件(上)
  2. oracle-ords
  3. 《深入解析Android 5.0系统》——第1章,第1.2节安装开发包
  4. ByteBuf和相关辅助类
  5. 【jQuery 区别】attr()和prop()的区别
  6. apicloud开发目标
  7. 详细解读Volley(二)—— ImageRequest Request简介
  8. Android draw9patch点九图常识
  9. HTML 基础知识回顾
  10. 现代软件工程 团队博客作业 如何评价个人在团队中的绩效