LeetCode 面试题56-I
解题的思路,数组中除了两个不同的元素外其余都两两相等,考虑到若是数组中只有一单独元素不同可以用异或值求解,那么就可以将该数组分成各包含一个单独元素两个数组。
如何划分数组呢?先对数组整体异或,得到两个单独数的异或值,之后,用这个值作为标志来筛选出后一个单独元素的位置,元素位置确定后就可以分成两个各包含一个单独数字的数组。
我的题解代码如下,leetcode上运行时间24ms,内存占用6.5MB
int* singleNumbers(int* nums, int numsSize, int* returnSize){ int sum=0; for(int i=0;i<numsSize;i++) sum^=nums[i];//求得两不同数字的异或值 int div=1; while(!(sum&div)) div<<=1;//找到后一个不同的元素,对数组元素进行分组 int *result=(int *)malloc(sizeof(int)*2); result[0]=0;result[1]=0;//记得要初始化/wulian for(int i=0;i<numsSize;i++){ if(nums[i]&div) result[0]^=nums[i]; else result[1]^=nums[i]; } *returnSize=2; return result; }