Leetcode Note: Go - Number Complement

Number Complement - LeetCode
https://leetcode.com/problems/number-complement/

  • Go 言語で取り組んだメモ

所感

  • int num で渡される 10 進数の数値に対する complement (補数) を int で return する
  • 例: num = 5 なら 2進数 にすると 101 なので補数は 010 になる 010 を 10進数 にすると 2 なので 2 を return する

回答

Golang solution faster than 100% bit manipulation - LeetCode Discuss
https://leetcode.com/problems/number-complement/discuss/1059500/Golang-solution-faster-than-100-bit-manipulation

func findComplement(num int) int {
	if num == 0 {
		return 1
	}
	res := 0
	g := 1
	for num > 0 {
		if num&1 == 0 {
			res += g
		}
		g <<= 1
		num >>= 1
	}
	return res
}
  • num が 1 以上であればループ
    • ループ毎に g を 1bit ずつ左シフトで増やしていき、 num を 1bit ずつ右シフトで減らしていく
    • num&1 == 0 は num における一の位が 1 かどうかをチェックしている
      • num が偶数の場合は一の位は 0 となるので true になる
      • true なら res を増やして補数カウントを進める
      • ループ毎に num を右シフトしているので、いずれヒットする
        • num が 1 以上の数値であればいずれヒットするので、最初に num の 0 チェックを行っている