某大厂的员工爆料说,+1和组里的外包有情况,更炸裂的是,这位外包在部门内已有一位npy,在公司外还有一个……
刚看到个贴子,说某大厂员工爆料:+1跟组里的外包眉来眼去,还给人各种资源倾斜。更离谱是这位外包在部门内有个npy,公司外还有一个……这剧情放小说里都嫌狗血。
网友调侃《外包逆袭我做对了什么》挺好笑,但笑归笑,职场真被这种暧昧关系搅进去,那就是纯遭殃。
资源不按能力走,团队氛围一定烂得飞起,干活的人心里都憋着火,这要放哪都不正常。
从我的角度看,谈恋爱没人管,但别影响公事,更不能玩“感情换资源”这套,最终倒霉的永远是踏实干活的人。
职场别整这些歪门邪道,踏实一点、清清爽爽的环境,谁都能舒服点。【备注:文末可领最新资料】
面试题:汉明距离
直接说结论吧:汉明距离这个东西,说白了就是“两个东西有几处不一样”,听着就很朴素对吧。
一、汉明距离是个啥?
先记一个简单版本的定义:
两个 长度相同 的“序列”(可以是 01 串、字符串、比特位),在同一个位置上有多少个地方不一样,这个数量就叫汉明距离。
举两个例子:
字符串:
"abcde"和"abXdy"逐位比:a vs a(相同) b vs b(相同) c vs X(不同) d vs d(相同) e vs y(不同) 不同的有两处,所以汉明距离是 2。 二进制:
10101和00111从左到右比:1 vs 0(不同) 0 vs 0(相同) 1 vs 1(相同) 0 vs 1(不同) 1 vs 1(相同) 也是 2。
在算法题里,最常见的是:给你两个非负整数,求它们的汉明距离。这时候我们一般是把整数当成二进制去看。
二、整数汉明距离:异或 + 统计 1 的个数
两个整数的二进制,如果某一位不同,那么:
0 和 1 不同 → 这一位做异或是 1 0 和 0、1 和 1 相同 → 这一位做异或是 0
所以有个非常好用的结论:
两个数的汉明距离 = 它们异或之后的结果中,二进制 1 的个数
比如:
x = 4 (0100)y = 1 (0001)x ^ y = 5 (0101),这里有两个 1,所以汉明距离是 2。
用 Python 写就很自然了:
defhamming_distance(x: int, y: int) -> int:
z = x ^ y # 先异或
count = 0
while z:
# z & 1 取最低位
count += z & 1
z >>= 1# 右移一位
return count
如果你用的是 Python 3.8+,还能更偷懒一点,因为整数有 bit_count() 方法:
defhamming_distance(x: int, y: int) -> int:
return (x ^ y).bit_count()
这个版本在力扣那种题里就足够用了,简单好记。
三、顺便夹带一点“位运算小优化”
上面那个 while 每次只消掉一位,其实还有一个常见小技巧:z & (z - 1) 会把 z 的二进制里 最低位的 1 清掉。
例如 z = 0b10100:
z - 1 = 0b10011z & (z - 1) = 0b10000(最低位那一个 1 不见了)
所以我们可以这样统计 1 的个数:
defhamming_distance(x: int, y: int) -> int:
z = x ^ y
count = 0
while z:
z &= z - 1# 每次消掉一个 1
count += 1
return count
这样循环次数等于“1 的个数”,对那种二进制里只有少数几位为 1 的情况,会更快一点(当然在面试里写哪个都行,解释得清楚就好)。
时间复杂度方面:
异或是 O(1) 统计 1 的个数最多循环到二进制位数次(比如 32 位整数就最多 32 次) 所以整体也就是 O(位数),可以当作 O(1) 常数时间。
四、字符串的汉明距离就更直白了
如果题目给的是字符串,比如:
给两个等长字符串,求汉明距离。
那就按人类直觉写就行了:一位一位比,不同就加 1。
defhamming_distance_str(s: str, t: str) -> int:
if len(s) != len(t):
raise ValueError("字符串必须长度相同")
diff = 0
for ch1, ch2 in zip(s, t):
if ch1 != ch2:
diff += 1
return diff
如果你喜欢一行流,也可以写成这样:
defhamming_distance_str(s: str, t: str) -> int:
if len(s) != len(t):
raise ValueError("字符串必须长度相同")
return sum(ch1 != ch2 for ch1, ch2 in zip(s, t))
这里 ch1 != ch2 是布尔值,True 当成 1,False 当成 0,sum 一下就变成数量了。
不搞花活,脑子里记住这两句基本就够应付大部分题了:
整数汉明距离:
先异或: z = x ^ y再数 z里有几个 1(bit_count()或自己写循环)
字符串汉明距离:
保证长度一样 逐位比,不同就加 1
最后丢一个完整的、常用的整数版本当模板,你可以直接背:
defhamming_distance(x: int, y: int) -> int:
return (x ^ y).bit_count()
以后面试官一说“汉明距离”,你脑子里就冒出“异或 + 数 1”这四个字,基本就稳了。
-END-
我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB