【原創】90%的人都不會作的一道筆試題

關注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,以上幾種場景都涉及到了,而且結果正確。

推薦閱讀

騰訊面試官:如何中止一個正在運行的線程?我一臉蒙……

一個高頻面試題:怎麼保證緩存與數據庫的雙寫一致性?

面試官:數據量很大,分頁查詢很慢,有什麼優化方案?

相關文章
相關標籤/搜索