題目:將一個n元一維數組a[n]左移i個位置。例如,當n=8,i=3時,數組abcdefgh旋轉爲defghabc。請設計一個算法完成這個任務。
雜技算法
分析:將a[0]存儲在一個臨時變量中,然後將a[i]替換a[0],a[2i]替換a[i]….當一個循環結束的時候,若替換次數小於n,則從a[1]開始替換…,需要經過gcd(n,i)(n和i的最大公約數)次循環後,才能把每一個元素都移到該移的地方。
- /*
- **
- ** tcpipstack @29/10/2012.
- ** shenzhen.
- **
- */
- #include <iostream>
- #include <string>
- using namespace std;
- /* Acrobat Rotate Shift Alogrithm */
- string AcrobatRotateShift(string str, int n);
- //
- int main(void)
- {
- string str1 = "abcdefg";
- string str2 = "";
- cout<<"str1= "<<str1<<endl;
- cout<<"str2= "<<str2<<endl;
- str2 = AcrobatRotateShift(str1, 2);
- cout<<"str1= "<<str1<<endl;
- cout<<"str2= "<<str2<<endl;
- getchar();
- return 0;
- }
- /*
- *
- * the Acrobat Rotate Shift Alogrithm
- *
- */
- string AcrobatRotateShift(string str, int n)
- {
- int strlen = str.length();
- int count = 0; //統計移動次數
- int i, j = 0; //k初始化爲0,從str[0]開始
- char temp;
- while (1)
- {
- //開始的元素保存到臨時變量temp中
- temp = str[j];
- i = (j + n) % strlen;
- //開始移動,直到遇到開始的元素
- while (i != j)
- {
- str[(i - n + strlen) % strlen] = str[i];
- count++; //移動次數統計量+1
- i = (i + n) % strlen;
- }
- //臨時變量temp中保存的值賦值給剛纔移動的最後一個位置
- str[(j - n + strlen) % strlen] = temp;
- count++;
- //判斷是否所有元素都已經移動
- if (count < strlen)
- {
- //沒有移動所有元素,再次從str[j+1]開始
- j++;
- }
- else
- {
- //所有元素都已經移動,跳出循環
- break;
- }
- }
- return str;
- }
翻轉算法
我們將問題看成把數組ab轉換成ba,同時假定我們擁有一個函數可以將數組中的特定部分元素求逆。從ab開始,先對a求逆,得到ar b,然後對b求逆,得到ar br ,然後整體求逆,得到(ar br)r 。此時就是ba。
- /*
- **
- ** tcpipstack @29/10/2012.
- ** shenzhen.
- **
- */
- #include <iostream>
- #include <string>
- using namespace std;
- string Reverse(string str, int m, int n);
- string InverseRotateShift(string str, int n);
- //
- int main(void)
- {
- string str1 = "abcdefg";
- string str2 = "";
- cout<<"str1= "<<str1<<endl;
- cout<<"str2= "<<str2<<endl;
- str2 = InverseRotateShift(str1, 5);
- cout<<"str1= "<<str1<<endl;
- cout<<"str2= "<<str2<<endl;
- getchar();
- return 0;
- }
- //
- string Reverse(string str, int m, int n)
- {
- char temp;
- while (m < n)
- {
- temp = str[m];
- str[m] = str[n];
- str[n] = temp;
- m++;
- n--;
- }
- return str;
- }
- string InverseRotateShift(string str, int n)
- {
- int strlen = str.length();
- str = Reverse(str, 0, n-1);
- str = Reverse(str, n, strlen-1);
- str = Reverse(str, 0, strlen-1);
- return str;
- }
以上。