题目
给你一个含
n
个整数的数组nums
,其中nums[i]
在区间[1, n]
内。请你找出所有在[1, n]
范围内但没有出现在nums
中的数字,并以数组的形式返回结果。难度:简单
题目链接:448. 找到所有数组中消失的数字
示例1
输入:nums = [4,3,2,7,8,2,3,1] 输出:[5,6]
示例2
输入:nums = [1,1] 输出:[2]
解题思路:
题目意思是再在有 n 个元素的数组中,找出[1,n]中没有出现的数组,其中 n 个元素中,可能会出现重复的元素,于是 我们就可以 再次创建一个临时数组tmp(每个元素置0),存放相应的元素来取消重复的元素。然后遍历整个数组,如果元素为零,则为没有出现在nums中的数字。
代码展示
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
int *arr = (int*)malloc(sizeof(int)*numsSize);//用于返回的数组
int tmp[100000] = {0};
int i = 0;
int x = 0;
for(i = 0;i<=numsSize;i++)
{
tmp[i] = 0;
}
for(i = 0;i<numsSize;i++)
{
x = nums[i]%(numsSize+1);
tmp[x-1] = x;
}
i = 1;
int count = 0;//记录返回数组的大小
int j = 0;
for(i = 1;i<=numsSize;i++)
{
if(tmp[i-1] == 0)
{
arr[j++] = i;
count++;
}
}
*returnSize = count;
return arr;
}
【解析】
这里的arr数组用于返回数组,tmp 临时数组主要用来消除重复的元素,主要思路
通过对循环每一个数组元素,对其进行取模运算,再将其放入对应的下标的数组中
但是前提是 要对 tmp数组每一个元素置0,
放入对应的下标的数组中后,
开始遍历数组,找出[1,n] 中没有出现在nums数组中的数字
for(i = 1;i<=numsSize;i++)
{
if(tmp[i-1] == 0)
{
arr[j++] = i;
count++;
}
}
接着就是返回 返回数组的大小和返回数组了。
*returnSize = count;
return arr;