[leetcode]136.Single Number
阿新 • • 發佈:2018-10-08
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