關注「Java後端技術全棧」**面試
回覆「面試」獲取全套大廠面試資料數據庫
數組操做的題目,有的確實比較容易,但並不是每一個問題都是如此。今天就來看道90%的人都不會作的筆試題。請看題:後端
給你一個數組 nums 和一個值 val,你須要 原地 移除全部數值等於 val 的元素,並返回移除後數組的新長度。數組
不要使用額外的數組空間,你必須僅使用 O(1) 額外空間並 原地 修改輸入數組。緩存
元素的順序能夠改變。你不須要考慮數組中超出新長度後面的元素。函數
示例:測試
給定 nums = [3,1,4,3], val = 3,函數應該返回新的長度 2,而且 nums 中的前兩個元素均爲 2。你不須要考慮數組中超出新長度後面的元素。優化
請暫時不要看下面,先思考一下,有沒有解答思路。spa
先線程
思
考
再
看
!
!
!
解題思路:
如今考慮數組包含不多的要刪除的元素的狀況。例如,num=[1,2,3,5,4],Val=4。按照不少人的思惟會對前四個元素進行復制操做,其實我們不必對前四個元素作複製操做。另外一個例子是 num=[4,1,2,3,5],Val=4。也彷佛沒有必要將 1,2,3,5 這幾個元素左移一步,由於問題描述中提到元素的順序能夠更改。
實現
當咱們遇到 nums[i] = val 時,咱們能夠將當前元素與最後一個元素進行交換,並釋放最後一個元素。這實際上使數組的大小減小了 1。
請注意,被交換的最後一個元素多是您想要移除的值。可是不要擔憂,在下一次迭代中,咱們仍然會檢查這個元素。
最多遍歷 n 步。在這個方法中,賦值操做的次數等於要刪除的元素的數量。所以,若是要移除的元素不多,效率會更高。
代碼以下:
public static int removeElement(int[] nums, int val) { if(nums == null){ return 0; } int i = 0; int n = nums.length; while (i < n) { //若是相等 //(注意噹噹前元素是5的時候,此時i並無加1) if (nums[i] == val) { //當前這個位置 nums[i] = nums[n - 1]; //數組大小減1 n--; } else { i++; } } return n; }
測試
場景1:數組爲null;
public static void main(String[] args) { int[] nums =null; int val = 5; System.out.println(removeElement(nums, val)); }
結果
場景2:數組中只有一個5
public static void main(String[] args) { int[] nums ={5}; int val = 5; System.out.println(removeElement(nums, val)); }
結果
場景三:數組中有一個5
public static void main(String[] args) { int[] nums ={1, 3, 5, 6}; int val = 5; System.out.println(removeElement(nums, val)); }
結果
場景4:數組中有多個5
public static void main(String[] args) { int[] nums ={1, 3, 5,5, 6}; int val = 5; System.out.println(removeElement(nums, val)); }
結果:
場景4:數組中沒有5
public static void main(String[] args) { int[] nums ={1, 3, 4, 6}; int val = 5; System.out.println(removeElement(nums, val)); }
結果
場景5:數組的最後一個元素是5
public static void main(String[] args) { int[] nums ={1, 3, 4, 5}; int val = 5; System.out.println(removeElement(nums, val)); }
結果
場景6:數組中有多個5,而且最後一個元素是5
public static void main(String[] args) { int[] nums = {1, 3, 5, 6, 8, 9, 5, 5}; int val = 5; System.out.println(removeElement(nums, val)); }
結果
最後一種場景:數組中全是5
public static void main(String[] args) { int[] nums = {5, 5, 5, 5}; int val = 5; System.out.println(removeElement(nums, val)); }
結果
ok,以上幾種場景都涉及到了,而且結果正確。
推薦閱讀