• 移除数组中指定元素的所有数


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

    这里是引用

    思路1:暴力查找——覆盖法,遇到一次val就挪动后面的数据删除

    在这里插入图片描述
    代码

    int removeElement(int* nums, int numsSize, int val)
    {
    	int i = 0;
    	for (i = 0; i < numsSize; i++)
    	{
    		if (nums[i] == val)
    		{
    		
    			int begin = i + 1;
    			while (begin < numsSize)
    			{
    				nums[begin - 1] = nums[begin];//覆盖
    				begin++;
    			}
    			numsSize--;//长度减1
    
    		}
    		
    	}
    	return numsSize;
    }
    int main()
    {
    	int nums[] = { 1,2,3,2,4,2,5,2,6 };
    	int val = 2;
    	int sz = sizeof(nums) / sizeof(nums[0]);
    	int size = 0;
    	size = removeElement(nums, sz, val);
    	int j = 0;
    	printf("%d\n", size);
    	for (j = 0; j < size; j++)
    	{
    		printf("%d", nums[j]);
    	}
    
    }
    
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    上述方法的时间复杂度为O(N^2)

    思路2:用空间来换时间,另外开辟一个数组空间
    在这里插入图片描述

    int* removeElement2(int* nums, int numsSize, int val)
    {
    	int* p = (int*)calloc(numsSize,sizeof(int));
    	int num = 0;
    	int n = 0;
    	for(int i=0;i<numsSize;i++)
    	{
    		if (nums[i] != val)
    		{
    			p[n] = nums[i];
    			n++;
    		
    		}
    		
    	}
    	printf("%d\n", n);
    
    	int j = 0;
    	for (j = 0; j < n; j++)
    	{
    		printf("%d", p[j]);
    	}
    
    	return 0 ;
    }
    int main()
    {
    	int nums[] = { 1,2,3,2,4,2,5,2,6 };
    	int val = 2;
    	int sz = sizeof(nums) / sizeof(nums[0]);
    	int size = 0;
    	//size = removeElement1(nums, sz, val);
    	removeElement2(nums, sz, val);
    	
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    思路3:原地移除,空间复杂度1,时间复杂度:O(N)
    在这里插入图片描述

    int removeElement3(int* nums, int numsSize, int val)
    {
    	int left = 0;
    	int right = 0;
    	for (right = 0; right < numsSize; right++)
    	{
    		if (nums[right] != val)
    		{
    			nums[left] = nums[right];
    				left++;
    			
    		}
    	}
    	printf("%d\n", left);
    		int j = 0;
    	for (j = 0; j < left; j++)
    	{
    		printf("%d", nums[j]);
    	}
    
    	return 0 ;
    }
    
    
    int main()
    {
    	int nums[] = { 1,2,3,2,4,2,5,2,6 };
    	int val = 2;
    	int sz = sizeof(nums) / sizeof(nums[0]);
    	int size = 0;
    	//size = removeElement1(nums, sz, val);
    	//removeElement2(nums, sz, val);
    	removeElement3(nums, sz, val);
    
    	
    }
    
    • 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
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    想学嵌入式开发,薪资怎么样?
    记录--源码视角,Vue3为什么推荐使用ref而不是reactive
    C++ Reference: Standard C++ Library reference: C Library: cmath: lgamma
    量化交易之One Piece篇 - onepiece_rsh - 按小节时间清洗全市场盘口数据
    【算法基础】:(二)希尔排序
    2021 CSP J2入门组 CSP-S2提高组 第2轮 视频与题解
    C++泛型编程--模版
    【C语言】顺序表(上卷)
    Ubuntu21.10升级22.04操作记录
    认识计算机中寄存器的本质
  • 原文地址:https://blog.csdn.net/qq2127189274/article/details/132849193