编程之美2.17 数组循环移位
这是一个很经典的题目,题目的大概意思是这样的:
有一个存储字符串的数组,需要按照要求循环移动数组中的字符,例如,数组中存储字符 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 数组循环移位相关推荐
- 编程之美2.17 数组循环移位
问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法----- ...
- c语言找出递增子数组的长度,编程之美2.16 数组中最长递增子序列的长度
改进的方法看的头大了却还是不清楚,哎...搞算法的苦啊,纠结啊. 编程之美这本书里面就有关于这道题的一些解法,求一个一位数组中的最长序列的长度.例如,在序列1,3,2中,最长递增序列是1,3. 这道题 ...
- 编程之美2.10:寻找数组中的最大值和最小值
编程之美2.10: 对于一个有N个整数组成的数组,需要比较多少次才能把最大值和最小值找出来呢? 算法的思想是: 分而治之 测试数据:---------------------------------- ...
- 编程之美2.1 求二进制中1的个数
最近一段的时间,一直在看编程之美之类的算法书籍,刚开始看编程之美,感觉到难度太大,有时候也不愿意去翻动这本书,不过,经过一段时间的修炼,我也彻底的喜欢上这本书了, 书中的算法涉及到很多方面,树,链表, ...
- 2017“编程之美”终章:AI之战勇者为王
编者按:8月15日,第六届微软"编程之美"挑战赛在选手的火热比拼中圆满落下帷幕."编程之美"挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起, ...
- Java 并发编程之美:并发编程高级篇之一-chat
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
- Java 并发编程之美:并发编程高级篇之一
借用 Java 并发编程实践中的话:编写正确的程序并不容易,而编写正常的并发程序就更难了.相比于顺序执行的情况,多线程的线程安全问题是微妙而且出乎意料的,因为在没有进行适当同步的情况下多线程中各个操作 ...
- 编程之美2.15 二维数组最大子数组的和(数组下标从(1,1)开始)
首先,我们看到这篇文章的题目,我们就会想到之前的那个题目 -- 连续子数组最大和问题.这个问题无疑就是把原问题扩展到二维的情况. 想起来这个问题也不是很难,我们可以求解一维矩阵 ...
- 编程之美2.14 求数组的子数组之和的最大值
这是一个在面试中出现概率很高的一道题目,就拿我来说吧,面试了5家公司中,两家公司问了这道题目,可见,这道题目是非常经典的. 解题思想也不是很难,我熟悉的有:两种解题办法: ...
最新文章
- 防抖技术 | OpenCV实现视频稳流
- 分布式计算的模式语言读后感
- Go netpoller 网络模型之源码全面解析
- KVO 和 KVC 的区别?
- linux关闭自检测进程,CentOS下自动发邮件检测某进程是否存在
- 福利网站!程序员面试——算法工程师面试大全第三部分
- 如何使用iMovie对抖动视频进行防抖处理?
- 增加window服务器,Windows Server2012入门-添加服务器角色和功能
- MyBatis动态代理执行原理
- 2014Esri全球用户大会——亮点系列之精彩应用案例
- 企业微信绑定企业邮箱服务器配置,企业微信企业邮箱开通规则说明介绍
- Schneider TM200CE40U 通讯与编程
- 贴片二极管正负极如何区分
- 利用“栈”快速计算——逆波兰表达式
- 如何群发邮件?教你发邮件时文件怎么命名、如何设置邮件格式,一文解决你的疑惑
- NLP 文本分词 java类方法,及opennlp 示例
- 计算机固态加机械硬盘,在台式机中添加固态/机械硬盘驱动器,让我与这篇文章一起教你...
- 百度啊,你是新年第一惨
- 3月18日 稠密光流FB,Deepflow,DIS,光流场的可视化
- (开源)一款可以发文字发图片的实时聊天微信小程序,可以滚动内容到底部