题目
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。
思路
1: 位运算,但是不具有一般性,如果把题目改一改就不行了
2: 哈希表,具有一般性,可以查看出现任意次数的数字,但是牺牲了空间,这里题目给出2<nums<10000,所以要在堆上分一个10000的数组,对于原始数组每一个数字,都以数字大小为哈希表下标的形式映射过去,没出现一次,哈希表对应+1。
#define MAX_VALUES 10001
int* singleNumbers(int* nums, int numsSize, int* returnSize){
int* arr=(int*) calloc(sizeof(int) , MAX_VALUES);
for(int i=0;i<numsSize;i++){
arr[ nums[i] ]++;
}
int *new_arr=malloc(sizeof(int)*2);
int k=0;
for(int i=0;i<MAX_VALUES;i++){
if(arr[i]==1)
new_arr[k++]=i;
}
*returnSize=2;
return new_arr;
}