演算法心得1 交換值 陣列移動

2021-06-22 02:14:44 字數 1534 閱讀 8597

交換兩個變數的值很簡單,只需要這麼寫:

void swap(int a,int b)

當然可以不用中間變數交換值,好像能省一點記憶體空間,但是實際意義也不是很大,但在面試或筆試中常常出現這個題目,可能會一下想不出來,但是仔細一想,發現這就類似解乙個二元一次方程,**如下:

void swap(int *a, int *b)

還是比較imba的。

陣列移動向左或向右移動一定的元素,又是乙個比較經典的問題,我也看到過有不少人寫過,不過我還是根據我自己的理解寫一下。

一般陣列移動是比較龐大的,雖然實現很簡單,但往往要考慮演算法的時間複雜性和空間複雜性(資料結構裡這麼說)。我羅列了大概下面幾種策略。

第一種,開闢乙個新的陣列,用於儲存原本的陣列,然後對原先的陣列進行操作,這裡寫偽**了(陣列長度為n,陣列移動元素):

swaparray(int a)

int b = a ;//開闢新陣列

shift(b,a);   //移動原來的陣列,用新的陣列修改原先的陣列

這樣,程式的空間複雜度是o(n),需要開闢乙個新的空間;時間複雜度是o(n),因為先移動賦值m個元素,然後再賦值n-m個元素;

第二種,不用開闢一新的陣列空間,只需要開闢乙個元素的空間,原理和第一種一樣,但是只是移動乙個元素,但是要移動m次才能滿足條件,以右移為例,偽**如下:

shift(int n,int a)//傳遞引數,長度,陣列指標

int temp ;

for(i=0;i

}  //直接對陣列操作,向某個方向移動乙個元素

swaparray(int a,int m,int n) //傳遞引數,陣列,長度,移動個數

for(i=0,i

這樣空間複雜度是o(1),時間複雜度是o(m*n),因為需要n次所有的元素進行交換;

第三種,具體怎麼做,我也說不清楚,只要進行三次從頭到尾的交換就可以了,只要看例子就可以明白:

假設陣列1234ab,右移兩位需要變為ab1234

1.分別交換前四個和後兩個元素,交換後的結果為4321ba 

2.交換所有元素的位置,得到ab1234

這個簡單明瞭,很簡單,但是確實最有效的,偽**如下:

int shift(int a,int n)  //陣列指標,長度

return 1;

}void swaparray(int a,int m,int n) //指標,移動元素個數,陣列長度

shift(a,n-m);

shift(&a[m-n],m);

shift(a,n);

這樣空間的複雜度為o(0),不需要額外的空間,時間複雜度為o(n),需要2次n/2的操作,綜上所述,這個比起第一第二種不論在時間還是在空間上都是最優的。

很高興能寫第一次寫這種文章,雖然很簡單,但是我還是會努力爭取深下去。

java演算法1 交換陣列和索引的值

題目 一副從1到n的牌,每次從牌堆頂取一張放桌子上,再取一張放牌堆底,直到手上沒牌,最後桌子上的牌是從1到n有序,設計程式,輸入n,輸出牌堆的順序陣列。題目 於一篇知乎上的文章 思路 在原牌堆a n 以1到n的方式進行標記 即 a 0 1,a 1 2.通過上述操作,產生新牌堆b n 若b k 中的數...

陣列移動演算法

ash前段時間貼出了乙個問題 對於有k個元素的陣列 int a k 寫乙個高效演算法將陣列內容迴圈左移m位 比如 int a 6 迴圈左移3位得到結果,要求 1不允許另外申請陣列空間,但可以申請少許變數 2不允許採用每次左移 這是乙個有趣的問題,當時ash給出了乙個很簡單的解法 1 將整個陣列倒排 ...

ZZULIOJ 1120 最值交換 陣列

time limit 1 sec memory limit 128 mb submit 4691 solved 2037 submit status web board 有乙個長度為n的整數序列。請寫乙個程式,先把序列中的最小值與第乙個數交換,再把最大值與最後乙個數交換。輸出轉換好的序列。分別編寫兩...