最近看到有關陣列右移的面試題,感覺有點意思,就和大家分享一下吧!
將乙個長度為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 開始時自己想的演算法就是最簡單原始的一種 每次將陣列右移一位,迴...