移除元素
题目:给你一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
//双指针法***
#include<stdio.h>
int remove(int *nums,int length,int val){
int slow=0;
for(int fast=0;fast<length;fast++)//注意快指针的初始值
//若快指针位置的元素不等于要删除的元素
if(nums[fast]!=val)
//将其挪到慢指针指向的位置,最后慢指针要+1
nums[slow++]=nums[fast];
return slow;//最后慢指针的大小就是新的数组的大小
}
int main(){
int nums[]={0,1,2,2,3,0,4,2};
int length=sizeof(nums)/sizeof(nums[0]);
int val;
scanf("%d",&val);
length=remove(nums,length,val);
for(int i=0;i<length;i++)
printf("%d ",nums[i]);
}
//写复杂了,LeetCode编译也不通过
#include<stdio.h>
int remove(int *nums,int length,int val){
if(length==0)//数组为空
return -1;
int i=0,j=length-1;
for(;i<=j;i++){
while(nums[i]==val&&i<=j){
if(nums[j]!=val){ //数组后不为val的值换掉前面的val值
nums[i]=nums[j];
j--;
}
else if(nums[j]==val)//j找到不为val的值为止
j--;
}
if(nums[i]==val)//说明j遍历完,每个元素值都为val
break;
}
if(i>0&&nums[i]==val)//前面都换好了,最后一个遍历完也没法换了
return i-1;
else if(i==0&&nums[i]==val)//所有元素值都为val
return -2;
else
return i;
}
int main(){
int nums[]={0,1,2,2,3,0,4,2};
int val;
int length=sizeof(nums)/sizeof(nums[0]);
scanf("%d",&val);
length=remove(nums,length,val);
if(length==-1)
printf("[]");
else if(length==-2)
printf("所有元素值均为val");
else{
for(int i=0;i<length;i++)
printf("%d ",nums[i]);
}
}