面试题40:数组中只出现一次的数字

这一题最关键的点在于,使用异或之后得到的是两个数的异或结果,如何区分开这两个数呢?
答案是,根据异或结果的一个为1的比特位,就可以把整个数组分为两组,这两组分别含有一个不同的数。在对分别对这两组数进行异或就能提取出唯一数了。

//num1,num2分别为长度为1的数组。传出参数
//将num1[0],num2[0]设置为返回结果
public class Solution {
    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
        int xor = 0;
        for(int i=0;i<array.length;i++){
            xor^= array[i];
        }
        int mask = 1;
        while((xor&mask)==0){
            mask<<=1;
        }
        num1[0]=0;
        num2[0]=0;
        for(int i=0;i<array.length;i++){
            if((array[i]&mask)==0){
                num1[0] ^= array[i];
            }else{
                num2[0]^=array[i];
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为...
    qmss阅读 3,987评论 0 1
  • 思路1:先将数组排序,从第一位比较和后面的数是否相同,相同就跳一位再继续比较,不同就记录一次,出现两次不同就结束 ...
    杰伦哎呦哎呦阅读 3,169评论 4 2
  • 问题描述: 一个整型数组里除了一个数字以外,其他数字都出现了两次。找出这个只出现一次的数字 算法思路:* 异...
    小陈阿飞阅读 5,934评论 0 0
  • 题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了偶数次。请写程序找出这两个只出现一次的数字。 化简问题...
    丶沧月阅读 1,807评论 0 0
  • 卖炭翁,伐薪烧炭南山中。 满面尘灰烟火色,两鬓苍苍十指黑。 卖炭得钱何所营?身上衣裳口中食。 可怜身上衣正单,心忧...
    铺子大街15号阅读 3,138评论 0 0