【C语言】找到数组中消失的数字(附赠冒泡排序,删除重复元素)

 这个原题需要

Note: The returned array must be malloced, assume caller calls free().

但是鉴于作者现在还不会malloc.......所以 ...... 教一个真正的C方法,真正的新手友好

首先这个题目很复杂,但是我们注意到给定数组nums是乱序的!

而且题目要求正常的数组应该是1~numsSize是连续的,顺序的

自然想到先排序!而且很多数组题都可以先排序找找思路——>冒泡排序

void bubble(int *nums,int n)
{
	for (int i = 0; i < n-1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (nums[j] > nums[j + 1])
			{
				int a = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = a;
			}
		}
	}
}

排序之后,每一个元素都可能有不确定个数的重复

如果把重复都去掉就好了

比如把1,2,4,3,3,2——>1,2,3,4

int delete(int* nums,int numsSize)
{
	for (int i = 0; i < numsSize; i++)
	{
		for (int j = i+1; j < numsSize ; j++)
		{
			if (nums[i] == nums[j])
			{
				for (int l = j; l < numsSize - 1; l++)
				{
					nums[l] = nums[l + 1];
				}
				numsSize -= 1;
				j--;
			}
		}
	}
	return numsSize;
}

每重复一个数字 ,用第三层循环向前移动一个下标 

相当于覆盖一个重复数字

此时数组长度需要-1

并且j-1,因为第二层循环的j要++,如果bu-1就会跳过一个元素

 

正常来说是不需要返回值的,但是后续涉及到用数组返回消失的数字

所以这里最好确定新数组(去重之后)元素个数,就是改变后的numsSize用int a接收

所以1,2,4,3,3,2——冒泡——>1,2,2,3,3,4——去重——>1,2,3,4

现在的nums数组和1,2,3,4,5,6就差下标为  a~原来numsSize   的数字,直接打印就行

(因为不会malloc)

注意!:原来numsSize要拿一个变量给固定住,不然就变化了


 打印

由于只需要打印5 6两个数字,又恰好是下标为  a~原来numsSize   的数字

直接打印即可

void print(int a, int n, int* ret)
{
	for (int i = a; i < n; ++i)
	{
		ret[i] = i + 1;
		printf("%d ", ret[i]);
	}
	
}

最终代码: 

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//数组个数为numsSize 返回一个数组是原数组漏掉的元素
void bubble(int *nums,int n)
{
	for (int i = 0; i < n-1; i++)
	{
		for (int j = 0; j < n - i - 1; j++)
		{
			if (nums[j] > nums[j + 1])
			{
				int a = nums[j];
				nums[j] = nums[j + 1];
				nums[j + 1] = a;
			}
		}
	}
}
int delete(int* nums,int numsSize)
{
	for (int i = 0; i < numsSize; i++)
	{
		for (int j = i+1; j < numsSize ; j++)
		{
			if (nums[i] == nums[j])
			{
				for (int l = j; l < numsSize - 1; l++)
				{
					nums[l] = nums[l + 1];
				}
				numsSize -= 1;
				j--;
			}
		}
	}
	return numsSize;
}

void print(int a, int n, int* ret)
{
	for (int i = a; i < n; ++i)
	{
		ret[i] = i + 1;
		printf("%d ", ret[i]);
	}
	
}

int* findDisappearedNumbers(int* nums, int numsSize) {
	bubble(nums,numsSize);
	int n = numsSize;
	int ret[20];
	
	int a=delete(nums, numsSize); //4

	print(a, n,ret);
	
	return ret;
}

int  main()   //完全可以不写,但是可以自己测试用
{
	int nums[] = { 4,2,2,3,3,1 };
	int numsSize = sizeof(nums) / sizeof(nums[0]);
	int *p=findDisappearedNumbers(nums, numsSize);
	
}

创作不易,感谢观看

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值