嗨,小伙伴们大家好! 我们一起来练习一道OJ题目吧!
咋一看这个题目好像看懂了,让我们来分析分析-------
我们假设数组nums里面的元素有4个,分别是3,2,2,3,val = 3。我们需要原地移除所有数值等于val的元素,也就是说,我们需要在这个数组里面找到"3",然后用数组中的其他值去覆盖这个元素。
我们在nums数组里面找到"3",这里首元素为"3",后面的元素依次向前移动,nums数组的前两个元素均为"2"。此时,数组返回的新的长度为2。
思路1:(在原数组上直接覆盖val)先定义变量i,用i去遍历原数组的每一个元素,再定义变量j,用它来遍历原数组的每一个元素,当nums[j]不等于val的值,j自增一次; 当num[j]等于val的值,直接跳过,最后返回j刚好是数组的新长度。
整体代码如下:
int removeElement(int* nums, int numsSize, int val) {
int i = 0;
int j = 0;
for(i = 0; i<numsSize; i++){
if(nums[i] != val){
nums[j] = nums[i];
j++;
}
}
return j;
}
思路2: (双指针法)定义一个src变量,一个dest变量,(不是真的指针,而是两个变量),刚开始的时候,dest和src都指向首元素(下标为0的位置)。
如果src指向的元素等于val,src++,src指向下一个元素。
如果src指向的元素不等于val,那么就把src指向元素的值赋值给dest指向的元素(src位置的值进行覆盖)。src指向下一个元素,dest指向下一个元素。(src++,dest++)。
此时,src已经超出数组的长度,循环到此结束,而dest刚好是移除元素后,数组的新长度。
具体代码如下:
int removeElement(int* nums, int numsSize, int val) {
int src = 0;
int dest = 0;
while(src < numsSize){
if(nums[src] == val){
src++;
}else{
nums[dest] = nums[src];
dest++;
src++;
}
}
return dest;
}
好啦,今天的讲解就到这里啦,我们下期再见!