程式設計之美2 17 陣列迴圈移位

2021-06-13 15:19:48 字數 990 閱讀 2652

題目描述:設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o(n),且只允許使用兩個附加變數,如abcd1234迴圈右移三位,

則為 abcd11234 ->4abcd123->34abcd12->234abcd1

思路一:暴力解法,一步步來,每次迴圈移位一次,移k%n次,此時複雜度為o(n^2)。

思路二:比較巧妙的思路,abcd1234->234abcd1,不難看出,其中兩段:234和abcd1順序是不變的,把這兩段看成是兩個整體。右移k位的過程中就是把陣列的兩部分交換一 

下。變換的過程中通過以下步驟完成:

1.逆序排序:abcd1234->abcd1432

2.逆序排列:abcd1432->1dcba432

3.全部逆序:1dcba432->234abcd1

具體**如下:

#include #include #include using namespace std;

void swap(char& a, char& b)

void reverse(vector& a, int left, int right)

}void rightshift(vector& a, int k)

int main()

; vectortemp(a, a+ 8);

for(vector::iterator iter = temp.begin(); iter != temp.end(); ++iter)

cout << *iter << " " ;

cout << endl;

rightshift(temp,3);

for(vector::iterator iter = temp.begin(); iter != temp.end(); ++iter)

cout << *iter << " " ;

cout << endl;

system("pause");

}

程式設計之美2 17 陣列迴圈移位

string rightshift1 string s,int n,int k return s string rightshift2 string s,int n,int k return s 對於abcd1234,若迴圈右移4位得到的1234abcd,可以看出有兩部分是沒有變的一部分是abcd,...

程式設計之美 2 17 陣列移位迴圈

設計乙個演算法,把乙個含有n個元素的陣列迴圈右移k位,要求時間複雜度為o n 且只允許使用兩個附加變數。方法 將陣列a 含n個元素 右移k位,相當於把a分為兩部分,前 n k 個元素a1和後k個元素a2,右移的過程是將兩部分交換位置,即原a a1 a2,移位後為a a2 a1,a1,a2內部的元素順...

程式設計之美2 17 陣列迴圈移位

問題描述 設計乙個演算法,把乙個含有n元素的陣列迴圈左移或者右移k位。解決方法 1.暴力解法 o kn 2.顛倒位置 o n 具體思路和 1.暴力解法 o kn 思路 迴圈k次,每次移動一位 1 右移 2void s1 int a,int n,intk 3 12 a 0 t 13 14 1 左移 2...