事情不是足以改变世界才算重要。

题目描述:

移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

解题代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution {
public:
int removeElement(vector<int>& nums, int val) {
int len = nums.size();
int n = 1;
int i;
bool is_end = false;
for(i = 0; i < len; i++){
while(nums[i] == val){
if(i + n == len ){
is_end = true;
break;
}
if(nums[i + n] != val){
swap(nums[i], nums[i + n]);
}else{
n++;
}
}
if(is_end){
break;
}
}
return i;
}
};

image-20230927224136448

解读与收获:

这道题我的思路是如果当前下标指向的元素数值等于val,那就将他和后面一个不为val的数交换,直到所有等于val的数交换到数组尾部,然后再返回实际长度就可以了。其中我设置了一个变量n,初始化为1,代表如果遇到等于val的数,就看他后面1位是不是也等于val,如果不是直接交换,如果是就将n++,代表之后会看后面第2位是否是val,n的值是永久改变的,因为按照该算法如果出现了两个或以上val连在一起的情况,如果不改变n的值,会导致val值之间换来换去,同时我加了一个判断标志,如果当前下标加上n的值超过了数组长度,那就说明下标后所有的值都是val,这时只要返回下标值(因为下标比实际长度少1),就等于数组最终长度。