1. 程式人生 > >[leetcode]136.Single Number

[leetcode]136.Single Number

eve leetcode 解法 length 基於 出現的次數 ext 暴力 表示

題目

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