力扣(LeetCode) ——645. 错误的集合(C语言)
题目:645. 错误的集合
集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例1:
输入: nums = [1 , 2 , 2 , 4]
输出: [2 , 3]
示例2:
输入: nums = [1 , 1]
输出: [1 , 2]
解释:
解题思路:
使用 calloc
开辟一个numsSize+1大小的空间,空间初始值为0。再开辟一个两个字节的空间用于存放返回值。
通过循环把 nums
数组的值放在开辟空间中的下标处,再创建两个变量,一个用于计算nums数组中值的总数,另一个用于存放1~numsSize的值。判断遇到重复值的存放在返回值下标为0的位置。
最后通过sum1-(sum2-ret[0])结果存放再返回值下标为1的位置。释放numsSize+1大小的空间。
最终代码:
int* findErrorNums(int* nums, int numsSize, int* returnSize)
{int* arr = (int*)calloc(numsSize+1,sizeof(int));int* ret = (int*)malloc(sizeof(int)*2);*returnSize = 2;int sum1 = 0;int sum2 = 0;for(int i = 0;i<numsSize;i++){if(arr[nums[i]] == 1){ret[0] = nums[i];}arr[nums[i]] = 1;sum1 += i+1;sum2 += nums[i];}ret[1] = sum1-(sum2-ret[0]);free(arr);return ret;
}
赶紧动起手来吧!!!
点击下方即可跳转
错误的集合