1. 程式人生 > >程式設計珠璣-第二章(字串旋轉與排序)

程式設計珠璣-第二章(字串旋轉與排序)

關於字串旋轉的一些想法
注意:區別字元旋轉和字串倒序排列的區別,旋轉為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;
    }
}