>[success] # 27. 移除元素
* 描述
給你一個數組 nums?和一個值 val,你需要 原地 移除所有數值等于?val?的元素,并返回移除后數組的新長度。
不要使用額外的數組空間,你必須僅使用 O(1) 額外空間并 原地 修改輸入數組。
元素的順序可以改變。你不需要考慮數組中超出新長度后面的元素。
* 示例 1:
~~~
輸入:nums = [3,2,2,3], val = 3
輸出:2, nums = [2,2]
解釋:函數應該返回新的長度 2, 并且 nums 中的前兩個元素均為 2。你不需要考慮數組中超出新長度后面的元素。例如,函數返回的新長度為 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也會被視作正確答案。
~~~
* 示例 2:
~~~
輸入:nums = [0,1,2,2,3,0,4,2], val = 2
輸出:5, nums = [0,1,4,0,3]
解釋:函數應該返回新的長度 5, 并且 nums 中的前五個元素為 0, 1, 3, 0, 4。注意這五個元素可為任意順序。你不需要考慮數組中超出新長度后面的元素。
~~~
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/remove-element
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
來源:力扣(LeetCode)
鏈接:https://leetcode.cn/problems/remove-element
著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。
>[danger] ##### js 第一次解法
* 如果當前位置值等于目標對象則刪除(刪除后不能移動指針此時值會前移動一位,因此此時指針為了對應后一個值不動,這樣前移的值會對應指針),否則移動指針

~~~
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
const {length} = nums
let index = 0
while(length>index){
if(nums[index] === val){
nums.splice(index,1)
}else{
index++
}
}
return nums.length
};
~~~
* 類似思路
~~~
/**
* @param {number[]}
* @param {number}
* @return {number}
*/
var removeElement = function(nums, val) {
for(let i=0;i<nums.length;i++){
if(nums[i]==val){
nums.splice(i,1)
i--
}
}
};
~~~
>[info] ## 快慢指針
* 利用快慢指針將數組分為三個區域,**慢指針**,**快指針**,**已處理區域**,要移除指定val 其實可以理解為**保留非指定val 值**,因此只要將快指針指到的**非指定值**移動到**保留區**,最后慢指針之前值都為符合題意值。
* 圖解要移除3

>[danger] ##### js
~~~
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let fast = 0
let slow = 0
while(fast<nums.length){
// 快指針指到值不等于當前值說明是要保留的
if(nums[fast] !== val){
// 將保留的值移動到慢指針
// 形成保留區域
nums[slow] = nums[fast]
slow++
}
fast++
}
return slow
};
~~~
>[danger] ##### java
~~~
class Solution {
public int removeElement(int[] nums, int val) {
int slow = 0;
int fast = 0;
while(fast < nums.length){
if(nums[fast] != val){
nums[slow] = nums[fast];
slow++;
}
fast++;
}
return slow;
}
}
~~~
>[info] ## 對撞指針
* 指針從左右兩端開始出發,當左指針遇到要移除值時候,右指針移動縮小范圍,可以理解一共有4個值其中存在兩個要移除值,此時遇到第一個時候4-1=3,做減法移除

>[danger] ##### js
~~~
/**
* @param {number[]} nums
* @param {number} val
* @return {number}
*/
var removeElement = function(nums, val) {
let left = 0
let right = nums.length - 1
while(left < right){
// 如果left 值等于移除值 移動right
if(nums[left] === val){
// 一直要讓left 和right 交換后left 現在值不為移除值
nums[left] = nums[right]
right --
}else{
// 如果left 不為移除值才能移動
left ++
}
}
return right + 1
};
~~~
>[danger] ##### java
~~~
class Solution {
public int removeElement(int[] nums, int val) {
int rihgt = nums.length - 1;
int left = 0;
while( left <= rihgt ){
if( nums[left] == val ){
nums[left] = nums[rihgt];
rihgt--;
}else{
left++;
}
}
return rihgt + 1;
}
}
~~~
- 刷題準備
- 統計數組中元素出現次數
- Leetcode -- 442數組中重復的數據
- leetcode -- 448 找到所有數組中消失的數字
- 字符類似題
- Leetcode -- 1002 查找共用字符
- Leetcode -- 1370上升下降字符串
- 指針類題解
- Leetcode -- 283 移動零
- Leetcode -- 26. 刪除有序數組中的重復項
- Leetcode -- 80. 刪除有序數組中的重復項 II
- Leetcode -- 27. 移除元素
- Leetcode -- 344. 反轉字符串
- Leetcode -- 125 驗證回文串
- Leetcode -- 11 盛最多水的容器
- Leetcode -- 1480. 一維數組的動態和