LeetCode 136. Single Number 只出现一次的数字(Java)

题目:

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

解答:

解法一:HashTable (不符合题目要求)

class Solution {
          
   
    public int singleNumber(int[] nums) {
          
   
        Map<Integer,Integer> map=new HashMap<>();
        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 i=0;
        for(;i<nums.length;i++){
          
   
            if(map.get(nums[i])==1){
          
   
                break;
            }            
        }  
        return nums[i];
    }
}

只想到了使用HashTable方法,但题目要求线性时间复杂度,而且不使用额外空间,使用哈希表不符合条件。参考他人解法学习了异或运算。

解法二:异或运算

异或(xor)是一个数学运算符。它应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”,在java里用 ^ 来表示。

异或运算法则: 如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。0⊕0=0,1⊕0=1,0⊕1=1,1⊕1=0(同为0,异为1)

异或运算性质: 1.恒定律:A ^ 0 = A 2.归零率:A ^ A = 0 3.交换律:A ^ B = B ^ A 4.结合律:(A ^ B) ^ C = A ^ (B ^ C)

本题中,假设数组为 [𝑎1,𝑎1,𝑎2,𝑎2,…,𝑎𝑛,𝑎𝑛,𝑎𝑥] ,其中,𝑎𝑥 只出现一次,其余的元素都出现两次,对该数组中的所有元素进行异或运算可得: 因此,只需要遍历数组中的所有元素,依次进行异或操作就可以找出只出现一次的元素。

class Solution {
          
   
    public int singleNumber(int[] nums) {
          
   
        int result=nums[0];
        for(int i=1;i<nums.length;i++){
          
   
            result^=nums[i];
        }
        return result;
    }
}
经验分享 程序员 微信小程序 职场和发展