力扣練習日記 只出現一次的數字

2021-10-06 03:45:12 字數 1797 閱讀 5736

擴充套件——只出現一次的兩個數字

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

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

示例 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 對出現的元素進行記錄,使...