LeetCode刷題總結 位運算奇技淫巧

2021-10-01 21:24:28 字數 2915 閱讀 2593

4. 注意

5. 練習題

以下**都存放於 我的github倉庫 ,如果小夥伴覺得有用,請給我顆星星哈。

以下**都是提交過的,正確性可以保證。

「與」運算

「或」運算

關於取模

func

ispoweroftwo

(x int

)bool

// 只適用於32位整數

func

ispoweroffour

(x int

)bool

// 適用於32、64位整數,但不適用於32位系統

func

ispoweroffour

(x int

)bool

// 適用於32、64位整數,適用於32、64位系統

func

ispoweroffour

(x int

)bool

func

ispoweroftwo

(x int

)bool

// 這裡只是形參的交換,如果要實現實參的交換,那麼可以傳入指標。

func

swap

(x,y int

)

func

hammingweight

(x int

)int

return count

}

func

hammingdistance

(x,y int

)int

func

hammingweight

(x int

)int

return count

}

func

getsum

(a int

, b int

)int

return

getsum

(sum, carry)

}

/*

現在假設現在有 personcount 人(標號[0, personcount-1]),他們每個人最多擁有30類物品(標號[0,29]),每類物品數量範圍為[0,10^6]。

現在給出他們分發物品的情況,每一種情況用乙個長度為 3 的切片表示。

如 [0, 5, 10],表示第 0 個人,被分發了 10 個第 5 類物品。

如 [5, 10, 1000],表示第 5 個人,被分發了 1000 個第 10 類物品。

現在給出人物編號 x、y,我想知道第 x 個人和第 y 個人 他們有多少類相同的物品、多少類不同的物品、以及他們一共有多少類物品。

以上輸入都在合法範圍內。

*/// personcount: 一共有多少人

// situations: 包含很多種擁有情況

// x,y : 兩個人的標號

func

solve

(personcount int

, situations [

]int

, x, y int

)(samekinds, unsamekinds, allkinds int)}

// 相同的物品表示 2 個人該二進位制位上都是1,所以使用 & 運算,再通過計算結果有多少個 1,就能知道有多少類相同的物品。

samekinds =

countone

(personown[x]

& personown[y]

)// 不同的物品表示 2 個人該二進位制位上是不同的,所以使用 ^ 運算,再通過計算結果有多少個 1,就能知道有多少類不同的物品。

unsamekinds =

countone

(personown[x]

^ personown[y]

)// 對於一共有多少類物品,兩個人在該二進位制位上有乙個 1 就可以了,再通過計算結果有多少個 1,就能知道他們一共有多少類物品。

allkinds =

countone

(personown[x]

| personown[y]

)// 例子:

// 如 personown[x] == 00000000000000000000000000000111

// personown[y] == 00000000000000000000000000001001

// 則 personown[x] & personown[y] == 00000000000000000000000000000001 表示x,y共同擁有第0類物品,所以它們只有1類相同物品

// personown[x] ^ personown[y] == 00000000000000000000000000001110 表示x,y第1、2、3類物品擁有情況不同,所以它們有3類不同物品

// personown[x] | personown[y] == 00000000000000000000000000001111 表示x,y一共擁有第0、1、2、3物品,所以它們一共有4類物品。

return

}// 計算 a 有多少個1

func

countone

(a int

)int

return count

}

// 快速冪,計算a^n,時間複雜度o(logn)

func

quickpow

(a, n int

)int

a = a * a

n >>=1}

return sum

}

位運算總結(刷題)

4.繼續刷題 不用額外的變數交換兩個整數的值 異或應用 5.不用任何比較判斷找出兩個數中較大的數 6.只用位運算不用算術運算實現整數的加減乘除運算 請實現乙個函式,輸入乙個整數,輸出該數二進位制表示中 1 的個數。例如,把 9 表示成二進位制是 1001,有 2 位是 1。因此,如果輸入 9,則該函...

位運算 刷題總結

位運算 從現代計算機中所有的資料二進位制的形式儲存在裝置中。即 0 1 兩種狀態,計算機對二進位制資料進行的運算 都是叫位運算。判斷兩個數是否異號 int x 1 y 2 bool f x y 0 true int x 3,y 2 bool f x y 0 false 這個技巧還是很實用的,利用的是...

位運算題 刷題總結

給定乙個整數陣列 nums,其中恰好有兩個元素只出現一次,其餘所有元素均出現兩次。找出只出現一次的那兩個元素。示例 輸入 1,2,1,3,2,5 輸出 3,5 方法 異或 我知道異或可以使所有一對一對的值都消失,得到只出現過一次的數的異或值,但是這題的重點是,你得到兩個只出現一次的數之後,如何區分?...