
這道題目給的陣列是無序的,要求刪除特定元素,然後返回剩餘陣列長度。相對簡單,思路是:依序找到不等於 val 的值,將其移至前面序列。需注意:第一次出現 val 之前的所有位置不能被覆蓋,所以未出現 val 前,pos 需與 nextpos 一起前移。使用 bool 值 begin 表示是否出現過 val,避免覆蓋無辜元素。
class Solution {
public:
int removeElement(vector& nums, int val) {
int len = nums.size();
int pos = 0; // 當前寫入位置
int nextpos = 0; // 掃描位置
int numofval = 0; // 統計 val 出現次數
bool begin = false; // 是否已遇到 val
while (nextpos < len) {
if (nums[nextpos] == val) {
begin = true;
++numofval;
++nextpos;
// 將後續非 val 元素前移
while (nextpos < len && nums[nextpos] != val) {
nums[pos++] = nums[nextpos++];
}
} else {
if (!begin) ++pos;
++nextpos;
}
}
return len - numofval;
}
};