@TOCjavascript
27.移除元素前端
題目自己其實挺簡單的,官方解答也說道了人們可能會對"就地"一次感到困惑
,並認爲在不復制數組的狀況下從數組中刪除元素是不可能的java
雙指針,僅返回長度,元素順序能夠更改,元素不多時算法
把題中的就地刪除理解爲覆蓋,也就是說,只要咱們找到一個和val同樣的值,咱們就把他覆蓋掉,因此咱們須要兩個指針,一個快指針用來尋找和比較元素,一個慢指針用來覆蓋元素,同時能夠利用js的length
的特性,在返回長度以前將數組的長度直接設置爲咱們計算的長度,這樣的好處是咱們能夠直觀的看到數組的結果,同時實現了真正意義上的修改原數組數組
在這裏考慮元素不多的狀況,當nums[j]
與給定的值不等時覆蓋,相等時length--
同時跳過該元素,也就是說最好的狀況下,數組內全部元素都與參數相等,那麼length自減到0同時直接返回0,最壞的狀況下全部元素都不等,所有覆蓋的同時返回length的,正常狀況只要nums[j]!==val
,咱們就把他覆用j指向的數值覆蓋掉,並遞增i,重複這個過程一直到j到達數組的末尾,數組的新長度爲length
spa
/** * @param {number[]} nums * @param {number} val * @return {number} */
const removeElement = (nums, val) => {
if (nums.length === 0) return 0
let { length } = nums
let [i, j] = [0, 0]
while (j < nums.length) {
if (nums[j] !== val) {
nums[i] = nums[j]
i++
} else {
length--
}
j++
}
nums.length = length
return length
}
複製代碼
傳入[1, 3, 9, 6]
和3的運行結果指針
3
[ 1, 9, 6 ]
複製代碼
執行結果code
執行用時 :64 ms, 在全部 javascript 提交中擊敗了91.87% 的用戶
內存消耗 :33.7 MB, 在全部 javascript 提交中擊敗了33.58%的用戶
複製代碼