- 思路
第一种方法:新建一个长度为numsSize的数组用于记录n是否存在,即遍历原数组时,将元素对应新数组的下标,若存在则赋值为1,最后再遍历一次找出新数组中没有赋值的元素的下标,即没有出现过的数字(测试用例很容易通过,不知道为什么提交有时候会过有时候过不了)
第二种方法:题目有提示可以在不分配额外空间的情况下完成,没有想出来怎么完成,在网上找到了大神的方法,可以遍历时直接将原数组元素对应原数组下标,为了不改变原来存储的值,则直接改原值为其负数,这样遍历时每次取绝对值就可以,最后一次遍历的条件即是否小于0
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
if(numsSize==0){
*returnSize = 0;
return nums;
}
int a[numsSize];
int elem;
for(int i=0; i<numsSize; i++){
elem = nums[i] -1;
a[elem] = 1;
}
int *b = (int *)malloc(numsSize * sizeof(int));
int i=0;
for(int j=0; j<numsSize; j++){
printf("%d",a[j]);
if(a[j] != 1)
b[i++] = j+1;
}
*returnSize = i;
return b;
}
int abs(int a){
return a>0 ? a:-a;
}
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize){
int *a = (int *)malloc(sizeof(int) * numsSize);
int j= 0;
for(int i=0; i<numsSize; i++){
if(nums[abs(nums[i])-1] > 0){
nums[abs(nums[i])-1] = -1 * nums[abs(nums[i])-1];
}
}
for(int i=0; i<numsSize; i++){
if(nums[i] > 0){
a[j++] = j+1;
}
}
*returnSize = i;
return a;
}