位运算
abant2
世界上最菜的arcem
展开
-
leetcode 461 汉明距离 位运算
此题很简单,异或之后求1的个数就行。 解法一:移位求1的个数 每次判断最后一位是否为1,然后移位即可。 解法二:n&n-1 这个做法只需看1有几个即可,因为n&n-1可以消去最后一个1,当为0时停止。 class Solution { public: int hammingDistance(int x, int y) { int ret = x^y, ans = 0; while(ret > 0) { a.原创 2021-07-17 16:16:40 · 52 阅读 · 0 评论 -
剑指offer 16 实现幂函数
此题一看就是快速幂,但要考虑负数的情况。此处最好的做法是把x变成1/x,同时n取反。这里要注意,由于负数比正数多一个,强行取反可能会越界,要用long long处理一下。 同时,零的零次方要注意,这里如果是面试,提前问好这个怎么定义,代码中直接作为0返回了。 注意,除2用右移操作会更快。 typedef long long ll; class Solution { public: double myPow(double x, int n) { if(n == 0)return 1;原创 2021-03-19 10:55:41 · 71 阅读 · 0 评论 -
剑指offer 15 +变形题目 位运算
题目一:用一句话判断一个数是否为2的次方 如果是的话,应该里面只有一个1,判断n&n-1是否为0即可。 题目二:输入两个整数m和n,计算改变多少位才能把m变成n 这个还是不太好想的,第一步求异或,位数不一样的地方为1。然后只要统计1的位数即可。如果要知道具体是哪几位,需要用遍历的方式,不能用n&n-1算位数。 ...原创 2021-03-18 15:14:54 · 48 阅读 · 0 评论 -
剑指offer 15 数字中1的个数
先来个简单的进制问题:Excel中,A代表1,AB代表28列,给一个字符串,返回数字。这个题就是转换成26进制做就很简单。 回到本题,其实思路类似于dp,每次判断最后一个是不是1,然后右移即可。注意:右移比你直接/2快很多。 class Solution { public: int hammingWeight(uint32_t n) { int ret = 0; while(n>0) { if(n&1)ret +=原创 2021-03-18 15:04:36 · 127 阅读 · 0 评论 -
leetcode 338 包含1的位数枚举
这个题的关键是,如果利用前面计算的结果得到后面的答案。一个简单的思路是,删除最高位的数字,然后+1,但是不幸的是,找到最高位需要对二进制位数进行枚举,花费较大。另一种做法和上个类似是利用奇偶数性质,如果当前是奇数,那一定是上一个的位数+1。如果当前位是偶数,那么当前位为0,就可将最后一个0去掉,右移后的结果已经计算过了,可以得到。 class Solution: def countBits(self, num: int) -> List[int]: ret = [0 for _原创 2021-03-03 18:58:21 · 48 阅读 · 1 评论