代码训练营-day02-数组和链表
27.移除元素
题目:给你一个数组nums,和一个值val,需要将数组中值为val的元素移除,返回数组中不等于val的值的个数
输入:数组nums,值val,数组长度numsize
处理:移除数组中值为val的元素
输出:数组中不等于val值的个数,新的数组
思路:
1.排序,二分查找
2.直接移除
问题1:怎么形成新的数组
情况一:新建一个同等大小的数组,将不为val的元素加入新的数组(不行,题目里强调了是原地移除,不能新建数组)
没看到写错了
int removeElement(int* nums, int numsSize, int val) {
int newnums[numsSize];
int j=0;
int i=0;
int target=0;//没必要,i就是新长度
while(numsSize--){//这里破坏了numsSize,导致return时返回值错误
if(nums[j]==val){
target++;
}
else {
newnums[i]=nums[j];
i++;
}
j++;
}
return numsSize-target
}
//改正版,但是加了新数组
int removeElement(int* nums, int numsSize, int val) {
int newnums[numsSize];
int j = 0;
int i = 0;
// 遍历所有元素
while (j < numsSize) {
if (nums[j] != val) {
newnums[i] = nums[j];
i++;
}
j++;
}
// 把新数组拷贝回原数组
for (int k = 0; k < i; k++) {
nums[k] = newnums[k];
}
// i 就是新长度
return i;
}
情况二:将原数组中为val的删除,后面的元素向前移动(这个才是原题目的想要的答案)
int removeElement(int* nums, int numsSize, int val) {
//暴力法:双层循环
int size=numsSize;
for(int i=0;i<size;i++){
if(nums[i]==val){
for(int j =i+1;j<size;j++){
nums[j-1]=nums[j];
}
i--;
size--;
}
}
return size;
}
int removeElement(int* nums, int numsSize, int val) {
//快慢指针
int slowIndex=0;
for(int fastIndex=0,int slowIndex=0;fastIndex<numsSize;fastIndex++){
if(nums[fastIndex]!=val){
nums[slowIndex++]=nums[fastIndex];
}
}
return slowIndex;
}

浙公网安备 33010602011771号