題目鏈接:https://leetcode.com/problems/remove-element/#/description
題目要求:刪除數組中的指定數,返回刪除該數之後的數組長度
思路:使用一個標記“指針”記錄下一個不會被刪除的元素應該保存的位置。
實例:原數組爲2,3,3,3,4,5,3,6 指定要刪除的數字爲3
(使用“|”來表示上述提到的標記指針,“|”之後的數所處的位置爲下一個下一個不會被刪除的元素應該保存的位置)
(紅色字體表示下一步要處理的數字)
過程如下:
(1)數組的初始狀態:| 2,3,3,3,4,5,3,6
(2)數組的第一個數字是2,不應該刪除,因此標記指針後移一位,數組變爲2, | 3,3,3,4,5,3,6(該步驟其實也有一次賦值,將數字2賦值到它的正確位置,也就是第一個位置)
(3)數組的第二個數字是3,應該刪除,因此標記指針不動,表示下一個不應該刪除的數應該保存到 | 後面的位置(也就是被刪掉的3的位置),數組狀態依舊爲2, | 3,3,3,4,5,3,6
(4)數組的第三個數字是3,應該刪除,因此標記指針還不動,表示下一個不應該刪除的數應該保存到 | 後面的位置,數組的狀態依舊爲2, | 3,3,3,4,5,3,6
(5)數組的第四個數字是3,應該刪除,因此標記指針還不動,表示下一個不應該刪除的數應該保存到 | 後面的位置,數組的狀態依舊爲2, | 3,3,3,4,5,3,6
(6)數組的第五個數字是4,不應該刪除,因此將4複製到它的正確位置,也就是 | 後面的位置,同時標記指針後移一位。數組的狀態變爲2, 4, | 3,3,4,5,3,6
(7)數組的第六個數字是5,不應該刪除,因此將5複製到它的正確位置,也就是 | 後面的位置,同時標記指針後移一位。數組的狀態變爲2, 4, 5, | 3,4,5,3,6
(8)數組的第七個數字是3,應該刪除,因此標記指針不動,表示下一個不應該刪除的數應該保存到 | 後面的位置,數組的狀態爲2, 4, 5, | 3,4,5,3,6
(9)數組的第八個數字是6,不應該刪除,因此將6複製到它的正確位置,也就是 | 後面的位置,同時標記指針後移一位。數組的狀態變爲2, 4, 5, 6, | 4,5,3,6
至此,處理過程結束,| 所處的位置的下標,即爲刪除指定數字之後,數組的長度。
Java代碼如下:
public class Solution {
// 刪除數組中的指定值
public int removeElement(int[] nums, int val) {
int rightIndex = 0;
// 使用一個“指針”記錄下一個不該刪除的元素應該保存的位置
for(int i=0; i<nums.length; i++){
if(nums[i] != val){
// 遍歷數組時,如果當前數字不是val,也就是不該刪除,將它賦值到它應該保存到的位置,然後將rightIndex後移一位
// 換句話說,如果當前數字是val,那麼當前數字應該被之後的某個數覆蓋掉,所以這種情況下rightIndex指針不必移動。
nums[rightIndex] = nums[i];
rightIndex ++;
}
}
// 遍歷結束後,rightIndex的值即爲刪除指定值之後,數組中有效的元素個數
return rightIndex;
}
}