擴充套件——只出現一次的兩個數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。
說明:你的演算法應該具有線性時間複雜度。 你可以不使用額外空間來實現嗎?
示例 1:
輸入: [2,2,1]
輸出: 1
示例 2:
輸入: [4,1,2,1,2]
輸出: 4
這裡先上**
public
class
singlenumber
return k;
}public
static
void
main
(string[
] args)
;// int nums = new int;
system.out.
println
(singlenumber
(nums));
}}
這裡運用的定義是:相同的數字,與自己異或的結果為0
因為陣列中,只有乙個數字出現了一次,其他數字都出現了兩次,所以 k ^= num的結果為那個唯一出現一次的數字,以上。
乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。
請寫程式找出這兩個只出現一次的數字。要求時間複雜度是o(n),空間複雜度是o(1)。
示例 1:
輸入:nums = [4,1,4,6]
輸出:[1,6] 或 [6,1]
示例 2:
輸入:nums = [1,2,10,4,1,4,3,3]
輸出:[2,10] 或 [10,2]
限制:2 <= nums <= 10000
這裡用的也是異或,先上**
public
static
int[
]singlenumbers
(int
nums)
int mask =1;
while
((k & mask)==0
)int a =0;
int b =0;
for(
int num : nums)
else
}return
newint
;}public
static
void
main
(string[
] args)
;int
nums =
; system.out.
println
(arrays.
tostring
(singlenumbers
(nums)))
;}
(這裡參照的是力扣某大佬的思路,為了深化記憶,遂記錄一下)
這裡看出來,除了正常的異或之外,還多了一些操作,具體是什麼呢?
我們來解析一下:
首先k ^= num之後呢,這裡的結果相當於要返回的兩個數字a和b的異或,即 k = a ^ b。
這個時候,我們需要把a和b兩個數字分開,那麼我們怎麼分開呢?
這裡,我們先找到a與b不同的最低位,即
int mask =1;
while
((k & mask)==0
)
此時,mask代表a與b不同的最低位,這個時候,用mask和num異或,為0的和a異或,為1的和b異或,這樣能保證所求結果的兩個數在不同的組中。異或完成則得到結果。 力扣136 只出現一次的數字
傻雕巴尼 題目位址 給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 2 輸入 4,1,2,1,2 輸出 4 暴力搜尋 hash表pu...
力扣136 只出現一次的數字
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現兩次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。你可以不使用額外空間來實現嗎?示例 1 輸入 2,2,1 輸出 1 示例 2 輸入 4,1,2,1,2 輸出 4 利用異或運算子,兩個相等的數異或以後結果等於...
力扣137 只出現一次的數字 II
給定乙個非空整數陣列,除了某個元素只出現一次以外,其餘每個元素均出現了三次。找出那個只出現了一次的元素。說明 你的演算法應該具有線性時間複雜度。題目鏈結 示例 1 輸入 2,2,3,2 輸出 3 示例 2 輸入 0,1,0,1,0,1,99 輸出 99 使用 hashset 對出現的元素進行記錄,使...