只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
题目来源:只出现一次的数字
在这里插入图片描述
方法一:
1)创建一个map,统计数组中数字出现的次数,key表示数字,value表示出现的次数
2)循环遍历数组,完成统计,如果这个数字在数组中第一次出现,就map.put(x,1),如果之前出现过了,就在当前次数上加1
3)遍历map,找出value为1的key

class Solution {
    public int singleNumber(int[] nums) {
        Map<Integer,Integer> map=new HashMap<>();
        for(int x:nums){
            Integer value=map.get(x);
            if(value==null){
                map.put(x,1);
            }else{
                map.put(x,value+1);
            }
        }
        for(Map.Entry<Integer,Integer> entry:map.entrySet()){
            if(entry.getValue().equals(1)){
                return entry.getKey();
            }
        }
        return 0;
    }
}

方法二:
异或:相同为0,相异为1
在这里插入图片描述

  public int singleNumber(int[] nums) {
        int ret=0;
        for(int x:nums){
            ret^=x;
        }
        return ret;
    }

扩展

题目来源:扩展

在这里插入图片描述
思路:
在这里插入图片描述

 //1.先把所有的数字异或到一起
        int ret=0;
        for(int x:nums){
            ret^=x;
        }
        //2.此时的异或结果相当于a^b,值一定不为0,就可以从中找到某个值为1的bit位
        int bit=1;
        int i=0;
        for(;i<32;i++){
            if((ret&(bit<<i))!=0){
                break;
            }
        }
        //循环结束之后,bit中的值,就是刚找到某一位为1的值
        //进行分组
        int a=0;
        int b=0;
        for(int x:nums){
            if((x&(bit<<i))!=0){
                //第一组,指定为1
                a^=x;
            }else{
                //第二组,指定为0
                b^=x;
            }
        }
        int[] array={a,b};
        return  array;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值