码迷,mamicode.com
首页 > 编程语言 > 详细

剑指offer:数组中只出现一次的数字

时间:2020-04-21 23:57:04      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:Once   除了   第一个   get   假设   bool   sbit   数组   就是   

题意描述

一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

解题思路

一、思路一

使用Set集合,遍历数组,当数字第一次出现时,加入Set,当数字第二次出现时,从Set中删除。最后Set中剩余的元素就是结果,赋值给num1、num2

二、思路二

利用异或运算:两个相同数字异或=0,一个数和0异或还是它本身 。

假设数组中两个不同的值是A、B,将数组中的元素逐个异或,最终结果就是AB异或的结果。

两值的区别是,在二进制表示的情况下,至少有一位不同。我们可以取第一个1所在的位数,将数组分成两部分。

相同的数值一定在同一组,不同的值一定在不同组。将两组值逐个进行异或处理,最终得到两个只出现一次的数值。

    public void FindNumsAppearOnce(int [] array,int num1[] , int num2[]) {
            if(array == null) return ;
            num1[0] = 0;
            num2[0] = 0;
            int bit = 0;
            for(int i=0;i<array.length;i++){
                bit ^= array[i];
            }
            int index = first(bit);		//得到第一个1所在的位置
            for(int i=0;i<array.length;i++){
                if(isBit(array[i],index)){	//根据 当前数字index位是否为1 进行区分
                    num1[0] ^= array[i];
                }else{
                    num2[0] ^= array[i];
                }
            }
    }

	public int first(int bit){
            int index = 0;
            while(((bit&1)==0) && index<32){	//从右向左开始查找,当前位不是1,并且没有溢出
                bit >>= 1;		//右移一位
                index ++;		
            }
            return index;
    }
	public boolean isBit(int target,int index){
            return ((target >> index) & 1) == 1;	//第index位是1 返回true
    }

剑指offer:数组中只出现一次的数字

标签:Once   除了   第一个   get   假设   bool   sbit   数组   就是   

原文地址:https://www.cnblogs.com/le-le/p/12748694.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!