要求时间复杂度空间复杂度都尽可能的低。
时间复杂度 O(n), 空间复杂度O(1),常量时间。
// 编程珠玑 第二章 字符串string循环移位i位
// eg "abcdefgh" 循环移位 3位 =》 "defghabc"
// 下面代码的简单思想是:
// 1:计算第一位将有谁来填(第四位 (currpos+i)%len ) d
// 2:计算第四位将有谁来填(第七位)
// 3:计算第七位。。。 直到所有的位置都移动一遍。
char* string_cyclicshift_v2( char* string, int i )
{
char ch;
int exchange;
int len;
exchange = 0;
len = strlen( string );
i = i%len;
if ( 0 == i )
return string;
int start_pos=0;
while ( exchange<len )
{
char ch = string[start_pos];
int currpos = start_pos;
int nextpos = (len+currpos+i)%len;
while ( nextpos != start_pos )
{
string[currpos] = string[nextpos];
++exchange;
currpos = nextpos;
nextpos = (len+currpos+i)%len;
}
string[currpos] = ch;
++exchange;
++start_pos;
}
return string;
}
//////////////////
2009/10/7 日后记
今天偶尔在图书馆的架子上发现了 2006你那《程序员》合订本的下册上也有同样的算法挑战题。
书上给出的解答也是用的这种方法,只是实现上,没有这里给出的代码高效!
不过书上倒是解释了,为什么有的时候循环一次,并不能移动所有的元素,而有的时候可以。
如果 字符串的长度 len 和循环移动位数k 的最大公约数为1的话,那么可以一次移动完毕。
else 如果 最大公约数为m,那么需要m次循环移动。