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;
}

 

posted @ 2020-04-28 10:05  runsdeep  阅读(179)  评论(0编辑  收藏  举报