1. 程式人生 > >只出現一次的數字 [LeetCode]

只出現一次的數字 [LeetCode]

length bsp ron 出現一次 -s 其余 一個 輸入 return

題目:

給定一個非空整數數組,除了某個元素只出現一次以外,其余每個元素均出現兩次。找出那個只出現了一次的元素。

說明:

你的算法應該具有線性時間復雜度。 你可以不使用額外空間來實現嗎?

示例 1:

輸入: [2,2,1]
輸出: 1

示例 2:

輸入: [4,1,2,1,2]
輸出: 4

審題:除了某個元素只出現一次以外,其余每個元素均出現兩次
1、線性時間復雜度:要求我們的代碼時間復雜度最高為O(n),不能有嵌套循環等。
2、不使用額外空間:要求空間復雜度最高為O(1)。

解題:
方法一:(異或法)
  完美思路:根據異或運算的特點,相同的數字經過異或運算後結果為0,除了單獨出現一次的數字外,其他數字都是出現兩次的,那麽這些數字經過異或運算後結果一定為0。而任何數字與
0異或運算都是該數字本身。所以對數組所有元素進行異或運算,運算結果就是題目的答案。
上代碼:
1 class Solution{
2     public int singleNumber(int[] nums){
3         int num = 0;
4         for (int i = 0; i < nums.length; i++){
5             num = num ^ nums[i];
6         }  
7         return num;
8     }    
9 }
方法二:(比較法)
  
思路:先對數組進行排序,然後對nums[i]和nums[i+1]進行比較,如相等,i += 2,繼續下一組比較,知道取到不想等的一組。
  註意:首先這個數組的長度肯定是奇數(目標數字只出現一次,其他所有數字出現兩次),所以如果上述步驟沒有找到不相等的一組數,那麽肯定是數組的最後一個數字是單獨出現的。
代碼如下:
class Solution {
    public int singleNumber(int[] nums) {
        Arrays.sort(nums);
        for (int i = 0; i < nums.length-1; i += 2){
            if (nums[i] != nums[i+1]){
                return nums[i];
            }
        }
        
return nums[nums.length-1]; } }

這種方法由於使用了Arrays.sot(int[] a)方法,時間復雜度是O(n3),不符合線性時間復雜度。

 

只出現一次的數字 [LeetCode]