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

来源:互联网 发布:误删数据库怎么恢复 编辑:程序博客网 时间:2024/06/05 06:15

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求算法的时间复杂度位O(Log2N),且只允许使用两个附加变量。
什么意思呢,就是说如果输入序列为:abcd1234,右移2位即变为34abcd12。唯一的要求就是使用两个附加变量。
其实这道题编程珠玑上面也出现过,书中给出的一种符合题意的解法是巧妙地进行翻转。以把abcd1234右移4位为例:

第一步:翻转1234,abcd1234———->abcd4321

第二步:翻转abcd,abcd4321———->dcba4321

第三步:整体翻转,dcba4321———->1234abcd

如果是代码实现,那也是很简单的了。我的一个实现如下:

#include <iostream>#include <string>using namespace std;void reverse(string& str,int begin,int end){  for(;begin<end;begin++,end--){    char temp=str[begin];    str[begin]=str[end];    str[end]=temp;  }}void rightShift(string &str,int len,int K){  K%=len;  reverse(str,0,len-K-1);  reverse(str,len-K,len-1);  reverse(str,0,len-1);}int main(int argc,char **argv){  string str="MarkLiang19941028";  int k;  cout<<"Enter K:"<<endl;  cin>>k;  cout<<"Before Reverse:\n"<<str<<endl;  rightShift(str,str.size(),k);  cout<<"After Reverse:\n"<<str<<endl;  return 0;}

参考书籍:编程之美,编程书籍

0 0
原创粉丝点击