只出現一次的數字 [LeetCode]
阿新 • • 發佈:2019-03-04
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]