大家好,我就是那个在B站讲算法的「华南溜达虎」。
今天看到一位北大的应届博士被最想去的吉利三重爆杀,三次都是挂在简历初筛,感觉很崩溃,表示还不如学习差一点,对自己的期望低一点,过去的成绩给了自己太多的期望,有一种高高举起被重重砸下的感觉。
评论区好几个北大的同学表示秋招至今也是0offer,自己都不敢抱怨,一抱怨别人就说是在贩卖焦虑。还有些同学说这跟专业有很大关系,有些专业就是为了扩招设立的,根本就没有对口的岗位,选个好专业比选学校更重要。
25届秋招已经开始了,我组织了一个秋招群,大家可以交流学习心得、面试经验,分享工作机会,有啥问题也可以在群里咨询。在群里我整理了一百多家已经启动秋招企业的文档,以及投递入口,每天都会更新,大家只要按照这个文档海投就可以了。
大家互帮互助相信一定可以拿下秋招!计算机相关专业的同学可以 点击底部的「阅读原文」 加群。
言归正传,今天我们来分享一道高频面试题「位1的个数」。
题目描述
编写一个函数,输入是一个无符号整数 (以二进制串的形式),返回其二进制表达式中数字位数为 1
的个数(也被称为汉明重量)。
思路解析
方法一
定义res
保存1
的个数。对于无符号整数n
,统计其中1
的个数步骤如下:
如果 n != 0
,n
对应二进制的最右边一位如果是1
,res++
,进入步骤2
。否则,返回res
。把 n
对应的二进制向右移动一位,进入步骤1
。
关键在于如何获取n
对应二进制的最右边一位和怎样将n
对应的二进制向右移一位。
获取n对应二进制最右面一位有两种方式:
n
和1
进行与运算n & 1
可以获取n
对应二进制的最右面一位。n
对2
取余n % 2
即可获取n
对应二进制的最右面一位。
将n
对应的二进制右移一位有两种方式:
直接使用编程语言自带的右移符号,比如 c++
可以写为n >> 1
。n / 2
也可以将n
对应的二进制右移一位。
C++代码
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while(n) {
//获取n对应二进制最右边一位
if (n % 2) {
++res;
}
//n对应的二进制右移一位
n = n / 2;
}
return res;
}
};
python代码
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
res = 0
while n:
# 获取 n 对应二进制最右边一位
if n % 2:
res += 1
# n 对应的二进制右移一位
n = n // 2
return res
方法二
定义res
保存1
的个数。对于无符号整数n
,统计其中1
的个数步骤如下:
如果 n != 0
,res++
,进入步骤2
。否则,返回res
。n = n & (n - 1)
,进入步骤1
。
n & (n - 1)
其实就是将n
对应的二进制最右边值为1
的bit位
置为0
。
在纸上继续按照上面步骤模拟一遍,会帮助大家更好的理解。
C++代码
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while(n) {
++res;
//n对应二进制最右边不为零的bit位置为零
n = n&(n-1);
}
return res;
}
};
python代码
class Solution(object):
def hammingWeight(self, n):
"""
:type n: int
:rtype: int
"""
res = 0
while n:
res += 1
# n 对应二进制最右边不为零的 bit 位置为零
n &= n - 1
return res
复杂度分析
时间复杂度: 两种方法都是O(1),因为二进制最长为32
位。
空间复杂度: 两种方法都是O(1),只使用了几个整型变量。
号外
经常使用leetcode会员的同学可以使用我的优惠通道啦!
https://leetcode.cn/premium/?promoChannel=ldtiger ,年度会员有效期比官网多俩月,季度会员有效期比官网多两个星期,还有专属福利,需要的读者朋友可以找我了解。
今天的分享就到这里,希望大家能有所收获!