字符串循环移位 - 编程珠玑的一道题

要求时间复杂度空间复杂度都尽可能的低。

时间复杂度 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次循环移动。

你可能感兴趣的:(字符串循环移位 - 编程珠玑的一道题)