数组中出现一次的数字

数组中只出现一次的数字

http://www.nowcoder.com/questionTerminal/389fc1c3d3be4479a154f63f495abff8

public class Solution {
    public void swap(int[] a, int l, int r){
        int o = a[l];
        a[l]=a[r];
        a[r]=o;
    }

    public int[] FindNumsAppearOnce (int[] array) {
        // write code here
        int[]a=new int[2];
        int x=array[0];
        //将数组中所有数字做异或处理
        //由于相同数字异或结果为0,0与数字x异或的结果为x
        //所以最终的结果为单独出现的数字的异或结果
        for(int i=1;i<array.length;i++){
            x^=array[i];
        }
        int m=1;
        //两个单独出现的数字若在m位相异,则在x中第m位为1
        //找到这样的m位
        while ((m&x)==0){
            m=m<<1;
        }
        //根据第m位的值将原数组分为两组,单独出现的两个数字分在不同的组
        for(int i:array){
            if((m&i)==0){
                a[0]^=i;
            }else {
                a[1]^=i;
            }
        }
        if(a[0]>a[1]){
            swap(a,0,1);
        }
        return a;

    }

}
全部评论
计算m的时候,可以不用循环 m = x; m |= (m << 1); m |= (m << 2); m |= (m << 4); m |= (m << 8); m |= (m << 16); m = (~m) + 1; 这样不论x是什么数字,只需要计算6次。
点赞 回复 分享
发布于 2021-06-17 10:35

相关推荐

07-18 22:55
海南大学 Java
点赞 评论 收藏
分享
温州头等大孝子:你们的确很幸福,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
字节跳动开奖364人在聊
点赞 评论 收藏
分享
评论
29
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务