2003网站建设,浏览器登录入口,公司网站制作公司排名,网站建设文件上传目录 专题1#xff1a;位移的妙用题目#xff1a;位1的个数#xff08;也被称为汉明重量#xff09;解法1#xff1a;遍历所有位#xff0c;判断每个位的数字是否是1Go代码 解法2#xff1a;依次消除每个1的位 numnum(num-1)Go代码 题目#xff1a;比特位计数思路… 目录 专题1位移的妙用题目位1的个数也被称为汉明重量解法1遍历所有位判断每个位的数字是否是1Go代码 解法2依次消除每个1的位 numnum(num-1)Go代码 题目比特位计数思路分析遍历每个数使用上面的位1的个数计算即可Go代码 题目颠倒二进制位思路分析获得低位的数值左移到高位去Go代码 专题2位实现加减乘除题目两整数之和思路分析ab1得进位a^b得非进位Go代码 题目递归乘法思路分析循环 位移Go代码 专题1位移的妙用
题目位1的个数也被称为汉明重量
题目链接LeetCode-191. 位1的个数
解法1遍历所有位判断每个位的数字是否是1
Go代码
func hammingWeight(num uint32) int {count : 0for i:0; i32; i {count int((num i) 1)}return count
}或者
func hammingWeight(num uint32) int {count : 0for i:0; i32; i {if num (1 i) ! 0 {count}}return count
}解法2依次消除每个1的位 numnum(num-1)
Go代码
func hammingWeight(num uint32) int {count : 0for num ! 0 {// 除了最后1个1在之后被去掉了前面的之后 1还是1 0还是0num num (num-1)count}return count
}题目比特位计数
题目链接LeetCode-338. 比特位计数
思路分析遍历每个数使用上面的位1的个数计算即可
Go代码
func countBits(n int) []int {ret : make([]int, 0)for i:0;in;i {ret append(ret, hammingWeight(i))}return ret
}func hammingWeight(n int) int {count : 0for n ! 0 {n n (n-1)count}return count
}题目颠倒二进制位
题目链接LeetCode-190. 颠倒二进制位
思路分析获得低位的数值左移到高位去
Go代码
func reverseBits(num uint32) uint32 {var ret uint32for i,j:0,31; i32 j0; i,ji1,j-1 {v : num i 1ret ret | (vj)}return ret
}专题2位实现加减乘除
题目两整数之和
题目链接LeetCode-371. 两整数之和
思路分析ab1得进位a^b得非进位
Go代码
func getSum(a int, b int) int {for b! 0 {carry : (a b)1 //计算进位a a ^ b //计算非进位部分的和b carry //更新 b 为进位}return a
}题目递归乘法
题目链接LeetCode-面试题 08.05. 递归乘法
思路分析循环 位移
在循环中不断将其中一个数加倍左移然后根据另一个数的每一位是否为1来决定是否将加倍后的数累加到最终的结果中。
Go代码
func multiply(A int, B int) int {min : getMin(A, B)max : getMax(A, B)ret : 0for min ! 0{//位为1时才更新到ret否则max一直更新if min 1 1 {ret max}min min 1 //min除以2max max 1 //max乘以2}return ret
}
func getMin(a int, b int) int {if a b {return b}return a
}
func getMax(a int, b int) int {if a b {return a}return b
}