字符串循環左移

要求時間複雜度空間複雜度都儘可能的低。

時間複雜度 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

發佈了20 篇原創文章 · 獲贊 2 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章