数组中出现一次的数字

数组中只出现一次的数字

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

相关推荐

29 收藏 评论
分享
牛客网
牛客企业服务