演算法篇之陣列右移

2021-10-05 20:44:49 字數 1879 閱讀 8382

最近看到有關陣列右移的面試題,感覺有點意思,就和大家分享一下吧!

將乙個長度為size的陣列a內的元素迴圈右移n位(當然左移也可以),比如陣列 右移3位之後就變成。

也是最常見的,也是最容易想到的:

用乙個一樣大小的格外空間,然後遍歷目標陣列,令b [(i + n) % size] = a [i]

public int shiftright(int ints, int n)

return ints2;

}

這個應該沒有太大難度。

接下來就有點需要點腦細胞了

我們可以觀察到 ->,這個過程中好像可以這樣看

->->

怎麼樣,是不是有點頭緒了,這裡用到的是乙個翻轉的思想,右移3位,那我就可以

翻轉前兩位,再翻轉後三位

//陣列元素從 m 到 n 反轉 

public static void reverse(int m, int n, int ints)

}public static int shiftright(int step, int ints)

reverse(m + 1, size, ints);

reverse(1, m, ints);

reverse(1, size, ints);

return ints;

}

這樣的話,第二種也就解密了

這種較於第一種,優點是:

把格外空間縮減到了只是用一些輔助的基本資料型別

最重要的是,相比於第一種,這種可能更加會讓你感受到思想的變化,以及演算法的魅力~~

接下來就是第三種,也即是最後一種了。

我們再觀察下 ->

我們可以看到,我們可以這樣思考,能不能把這個過程進行更細的拆分呢,就像:

因為右移3位,那麼我們把陣列下標為 0 的移到了下標為 3 的,這樣我們就搞定了乙個,然後再從下標為 3 的出發,右移它就要移到下標為 1 的位置,這樣我們就解決了2個,如此下去,我們就能實現右移的工作,在這個過程中會有兩個問題需要解決:

我們要這樣幾次,萬一到了交換過的詞後,還沒全轉換完怎麼處理?

這時候,我列了兩組資料進行對比思考下:

7 (數值長度為 7 的話) :

右移 1 需要1次

右移 2 需要1次

右移 3 需要1次

右移 4 需要1次

8 (數值長度為 7 的話) :

右移 1 需要1次

右移 2 需要1次

右移 3 需要1次

右移 4 需要4次

這看上去感覺就和公因數有點關係,而且還是最大公因數,那這個問題就解決了

這個過程我還修改了**用工廠模式順便實現了如果左移的話怎麼處理

inte***ce shiftfactory 

class shiftleft implements shiftfactory

}class shiftright implements shiftfactory

}class shiftvalue

ints[i] = index;

}return ints;

}}class gongyueshu

return b;

}}

這裡確定左移和右移需要注意的有以下兩點:

1.gys,也即是上面提到的輪詢次數,這裡我們要注意負數需取絕對值

2.操作到下乙個目標位置的時候,需要 + ints.length,也即是陣列長度,因為我們定義右移為正的話,那麼左移就為負,防止越界。

好了,三種方法寫完了,大家有什麼看法嗎?或者說覺得這裡**寫得不好,也期待大家指出一起成長。

大家一起來思考一下,這個能使用在哪些方面呢?

資料結構和演算法之陣列右移K

基本思路 不開闢新的陣列空間的情況下考慮在原屬組上進行操作 將陣列倒置,這樣後k個元素就跑到了陣列的前面,然後反轉一下即可 同理後 len k個元素只需要翻轉就完成陣列的k次移動 public class arraykshift k k array.length if 0 k reverse arr...

Leetcode 初級演算法 陣列迴圈右移

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例1 輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,4...

陣列迴圈右移

描述 將乙個長度為 n 的陣列 a 的元素迴圈右移 ror,rotate right k 位,比如陣列 1,2,3,4,5 迴圈右移 3 位之後就變成 3,4,5,1,2。要求 只能用乙個元素大小的附加儲存,元素移動或交換次數為o n 開始時自己想的演算法就是最簡單原始的一種 每次將陣列右移一位,迴...