90%的人都不会做的一道笔试题
關注“Java后端技術全棧”
回復“面試”獲取全套大廠面試資料
數組操作的題目,有的確實比較容易,但并非每個問題都是如此。今天就來看道90%的人都不會做的筆試題。請看題:
給你一個數組 nums 和一個值 val,你需要 原地 移除所有數值等于 val 的元素,并返回移除后數組的新長度。
不要使用額外的數組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。
元素的順序可以改變。你不需要考慮數組中超出新長度后面的元素。
示例:
給定 nums = [3,1,4,3], val = 3,函數應該返回新的長度 2,并且 nums 中的前兩個元素均為 2。
你不需要考慮數組中超出新長度后面的元素。
請暫時不要看下面,先思考一下,有沒有解答思路。
解題思路:
現在考慮數組包含很少的要刪除的元素的情況。例如,num=[1,2,3,5,4],Val=4。按照很多人的思維會對前四個元素進行復制操作,其實咱們沒必要對前四個元素做復制操作。另一個例子是 num=[4,1,2,3,5],Val=4。也似乎沒有必要將 [1,2,3,5][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];//數組大小減1n--;}?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,以上幾種場景都涉及到了,并且結果正確。
IT技術分享社區
個人博客網站:https://programmerblog.xyz
文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎知識硬件:斷路器、接觸器、繼電器基礎知識
總結
以上是生活随笔為你收集整理的90%的人都不会做的一道笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 3GP、MP4视频转换器下载
- 下一篇: finereport 格式化金额函数_帆