分組位運算 陣列中數字出現的次數(Go語言)

2021-10-21 03:28:02 字數 1241 閱讀 5754

劍指offer56-i

預備知識:異或運算 和 &運算

1、異或運算:

因為 1^1=0 1^0=0 所以 4^4 = 100 ^ 100 = 000 即 a ^ a = 0

所以如果一組只有乙個數出現一次的時候全員異或一遍即可得到這個特殊的數 eg:[3,1,3] = 3 ^ 1 ^ 3 = 1

2、&運算
1&1=1 1&0=0 0&0=0 所以 6 & 1 = 110 & 001 = 000 或 6 & 4 = 110 & 100 = 100

分組思路:
從上面知道"如果一組只有乙個數出現一次的時候全員異或一遍即可得到這個特殊的數",那麼組裡有兩個只出現一遍的數怎麼辦?

我們自然是想把它們進行分成兩組a組和b組,然後a組全員異或得到特殊數a,b組全員異或得到特殊數b

而這兩組自然要滿足如下條件:(此處以[1,2,7,4,1,4]陣列作為例子)

如何分組:

兩個不同的數進行異或運算後一定至少有乙個位是為1的(否則全部為0代表是相同的數字)

eg:2^7 = 010 ^ 111 = 101

通過逐一與mask變數進行&運算區分為兩組:

mask變數怎麼得到?

我們宣告乙個mask變數,這個變數滿足的要求就是除了兩個特殊數的異或結果的"那一位不為1的位置"是1以外別的都是0

所以這個例子中mask可以001(1)或者100(4),這裡假設選擇001

mask變數是怎麼將乙個陣列區分為兩組的?

**:

func

singlenumbers

(nums [

]int)[

]int

獲得mask

//先假設ret的第一位為1,所以初始mask為001

mask :=

1for ret & mask ==

0區分兩組進行全員異或得到兩個特殊數

//先初始化兩個特殊數

a, b :=0,

0for

_, num :=

range nums

else

}return

int}

陣列中數字出現的次數

題目 乙個整型陣列 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 或 1...

陣列中數字出現的次數

陣列中數字出現的次數 乙個整型陣列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,...

陣列中數字出現的次數

乙個整型陣列 nums 裡除兩個數字之外,其他數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。define crt secure no warnings include include include 異或 intcontinuousxor int arr,int sz return ret ...