集合 s 包含从 1 到 n 的整数。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复 。
给定一个数组 nums 代表了集合 S 发生错误后的结果。
请你找出重复出现的整数,再找到丢失的整数,将它们以数组的形式返回。
示例 1:
输入:nums = [1,2,2,4]
输出:[2,3]
示例 2:
输入:nums = [1,1]
输出:[1,2]
哈希表
1 /** 2 * Note: The returned array must be malloced, assume caller calls free(). 3 */ 4 int* findErrorNums(int* nums, int numsSize, int* returnSize){ 5 int *hash = (int *)malloc(sizeof(int) * (numsSize + 1)); 6 memset(hash, 0, sizeof(int) * (numsSize + 1)); 7 8 *returnSize = 2; 9 int *res = (int *)malloc(sizeof(int) * 2); 10 for(int i = 0; i < numsSize; i++) { 11 hash[nums[i]]++; 12 } 13 for(int i = 1; i < numsSize + 1; i++) { 14 if(hash[i] == 2) { 15 res[0] = i; 16 }else if(hash[i] == 0) { 17 res[1] = i; 18 } 19 } 20 return res; 21 }
ut_hash
1 struct my_struct{ 2 int key; 3 int val; 4 UT_hash_handle hh; 5 }; 6 7 struct my_struct *users = NULL; 8 9 void add_user(int keyid) { 10 struct my_struct *s; 11 HASH_FIND_INT(users, &keyid, s); 12 if(s == NULL) { 13 s = (struct my_struct *)malloc(sizeof(struct my_struct)); 14 s->key = keyid; 15 s->val = 1; 16 ////HASH_ADD_INT第二个参数传入是结构体定义key字段名称 17 HASH_ADD_INT(users, key, s); 18 } else { 19 s->val++; 20 //HASH_ADD_INT(users, key, s); 这里不用重新 add 21 } 22 } 23 24 int find_user(int keyid) { 25 struct my_struct *s; 26 HASH_FIND_INT(users, &keyid, s); 27 if(s == NULL){ 28 return 0; 29 }else if(s->val == 2) { 30 return 2; 31 } 32 return 1; 33 } 34 35 36 int* findErrorNums(int* nums, int numsSize, int* returnSize){ 37 users = NULL; 38 *returnSize = 2; 39 int *res = (int *)calloc(2, sizeof(int)); 40 41 //存哈希表 42 for(int i = 0; i < numsSize; i++) { 43 add_user(nums[i]); 44 } 45 46 //遍历哈希表里面的值 , 从 1 -》 numsSize , 找出 key id 没有的 和 val ==2 的值 47 for(int i = 1; i <= numsSize; i++) { 48 if(find_user(i) == 2) { 49 res[0] = i; 50 } 51 if(find_user(i) == 0) { 52 res[1] = i; 53 } 54 } 55 return res; 56 }