要求時間複雜度空間複雜度都儘可能的低。
時間複雜度 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次循環移動。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/zdl1016/archive/2009/09/21/4575309.aspx