[leetcode]136.Single Number

Posted shinjia

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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

解法一

思路

暴力解法,直接两个for循环,用一个count数组来保存nums数组每个元素出现的次数,最后遍历一遍count数组,找出值为1的那个下标res,然后返回nums[i]即可。时间复杂度为O(n2)。

代码

class Solution {
    public int singleNumber(int[] nums) {
        int[] count = new int[nums.length];
        int res = -1;
        for(int i = 0; i < nums.length; i++)
            for(int j = 0; j < nums.length; j++) {
                if(nums[i] == nums[j])
                    count[i]++;
            }
        for(int i = 0; i < count.length; i++)
            if(count[i] == 1) res = i;
        return nums[res];
    }
}

解法二

思路

先将nums数组排序,先后再遍历一次数组即可,时间复杂度取决于所用的排序算法。

代码

class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        int res = -1;
        for(int i = 0; i < nums.length; i+=2) {
            if(i == nums.length-1 || nums[i] != nums[i+1]) {
                res = nums[i];
                break;
            }
        }
        return res;
    }
}

解法三

思路

这种解法真!的!太!精!彩!了!啊!运用了XOR(异或)运算符 ^= 。

异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。
简单理解就是不进位加法,如1+1=0,,0+0=0,1+0=1。
性质
1、交换律
2、结合律(即(a^b)^c == a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x
4、自反性 A XOR B XOR B = A xor 0 = A

也就是说对于任何一个数N,N^N=0,0^N=N,所有这道题,我们只要对所有元素求异或即可,res初始化为0是因为0^N=N,不会影响结果。

代码

class Solution {
    public int singleNumber(int[] nums) {
        int res = 0;
        for(int i = 0; i < nums.length; i++) {
            res ^= nums[i];
        }
        return res;
    }
}









以上是关于[leetcode]136.Single Number的主要内容,如果未能解决你的问题,请参考以下文章

Leetcode-136 Single Number

LeetCode 136 Single Number

LeetCode 136. Single Number

LeetCode 136. Single Number

[leetcode]136.Single Number

[Leetcode] 136. Single Number