这个原题需要
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
- //数组个数为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);
-
- }
创作不易,感谢观看