LeetCode(27):移除元素

发布于:2025-03-24 ⋅ 阅读:(39) ⋅ 点赞:(0)

移除元素

题目链接

题目:给你一个数组 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]);
	} 
}


网站公告

今日签到

点亮在社区的每一天
去签到