leetcode #136. Single Number

Given a non-empty array of integers, every element appears twice except for one. Find that single one.

Note:

Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

Example 1:

Input: [2,2,1]
Output: 1
Example 2:

Input: [4,1,2,1,2]
Output: 4

思路
拿到题首先想到的是把数组存进hashmap然后找出value为1的,但是做了以后发现时间复杂度太复杂

然后想到把数组排序然后两两比较,但是这也也不够快

最后看到大神解法
,我们看看它做了什么,先设定一个0,然后循环和数组中的每个数去做异或运算,每次得出的结果都继续和下一个数再异或。最后得出来的结果就是单个的那个数了!为什么?我演算了一下希望找到规律,发现确实如此。因为异或这个运算有三个很重要的特性:

两个相同的数异或后为0;
0和一个数异或后为那个数;
异或运算满足交换律。
————————————————

int result =0;
    for(int j = 0; j< nums.length;j++){
        
        result ^= nums[j];
    }
    return result;

知识点
java异运算
java异或运算

class Solution {
    public int singleNumber(int[] nums) {
        
        /* 方法一:存入hashmap
        HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();
        
        for(int i =0;i < nums.length;i++){
            if(map.containsKey(nums[i])){
                map.put(nums[i],map.get(nums[i])+1);
            }
            else{
                map.put(nums[i],1);
            }
        }
        
        int res = 0;
        for(int j = 0; j< nums.length;j++){
            if(map.get(nums[j]) == 1){
                res= nums[j];
                break;
            }
            
        }
        return res;
        
        */
        
        int result =0;
        for(int j = 0; j< nums.length;j++){
            
            result ^= nums[j];
        }
        return result;
    }
}```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值