程式設計珠璣-第二章(字串旋轉與排序)
阿新 • • 發佈:2019-02-10
關於字串旋轉的一些想法
注意:區別字元旋轉和字串倒序排列的區別,旋轉為abcd-》cdad
1.雜耍演算法
特點:可以在空間有限的情況下解決問題,但是快取效能差。
#include <iostream>
#include <assert.h>
using namespace std;
/*獲取m和n的最大公約數*/
int GCD(int m,int n)
{
int tmp;
if (m < n)
{
tmp = m;
m = n;
n = tmp;
}//調整數字大小順序
if (m % n == 0)
{
return n;
}
else
{
return GCD(n,m%n);//此處使用的是輾轉相除法來求最大公約數
}
}
void RotateString(char* str,int k)
{
assert(str != NULL && k > 0);
int strLen = strlen(str);
int GCDNum = GCD(strLen,k);
for (int i = 0;i < GCDNum;i++)//最大公約數即是迴圈的次數
{
int first = i;
int next = (first + k) % strLen;
char tmp = str[i];
while(next != i)//移位停止的條件是當下一個元素移位回到起始點
{
str[first] = str[next];
first = next;
next = (first + k) % strLen;
}
str[first] = tmp;//臨時儲存的變數最後單獨賦值
}
}
int main()
{
char str[30] = "abcdef";
RotateString(str,3);
cout<<str<<endl;
return 0;
2.可以使用求逆的方式
將總字元分成兩個部分,先分別倒排,再整體倒排一次。例如12345-32145-32154-45123
reverse(0,i-1);
reverse(i,n-1);
reverse(0,n-1);
void reverse(char* str,int start,int end)
{
char temp;
int mid = (start + end)/2;
for(int i = start,int j = end;i < = mid;i++,j++)
{
temp = str[start];
str[start] = str[end];
str[end] = temp;
}
}