骗外包有机会转正,从那天以后他每天主动加班到2点
今天看到一个网友的吐槽,真是有点让人捧腹。
事情是这样的:这位网友是外包员工,结果有个人告诉他:“你只要加班表现突出,就有机会转正!”于是,他信了,每天拼命加班,做到凌晨2点,满心期待着转正的机会。
作为一个程序员,我得说,真不值得啊。加班的意义,不是为了向老板证明自己多能干,而是看你能否高效地完成工作任务。
如果你拼命加班,却没有提升自己的工作能力,那这种加班就失去了意义。
很多时候,职场上所谓的“转正机会”其实是空头支票,根本没有那么简单。你以为加班到深夜就能得到认可,但真正决定你能否转正的,是你的实际工作表现和解决问题的能力,而不是你熬了多少个夜。
加班到凌晨2点,可能会让你觉得自己付出了很多,但如果没有提升自己的核心能力,最后得到的可能只是更多的疲惫。
所以,职场上还是要理智,别让那些虚假的承诺把自己累坏了。
要转正,就靠实力,而不是“拼命”加班。
算法题:整数替换
今天我们来聊一个有趣的算法题:整数替换。如果你刚好也在刷题,那么你可能已经见过这个题目,或者说它已经成为了面试中比较常见的考点。好了,废话不多说,我们直接进入正题。
问题是这样的:给定一个整数 n,我们需要不断地将 n 替换为两个数的差,直到 n 变成 1。每次替换的操作是:
如果 n是偶数,那么就将n替换为n / 2。如果 n是奇数,那么就将n替换为n + 1或者n - 1,然后选择哪个更合适。
问题其实就是考察我们如何将这个数“削减”到 1。看似简单,但其中的策略和算法的选择,可就有一点技巧了。
我在看到这个题目时,脑袋里第一个反应是——递归???
思路解析
首先,我们需要弄清楚这道题最重要的两点:奇偶性判断和优化。这两者会影响我们的算法设计。
奇数的处理:对于奇数来说,我们面临的两个选择是:
那么问题就来了,什么时候选择
n + 1,什么时候选择n - 1呢?这是一个经典的博弈问题,最常见的做法是判断
n的二进制形式来决定。举个例子,假如n是一个奇数,我们首先看它的二进制表示。如果它末尾是11(也就是二进制末尾有两个连续的1),那就倾向于选择n - 1,因为这样会把一个大的 1 拿掉,剩下的位数可能减少得更快。而如果末尾是01或00,就倾向于选择n + 1,因为这样可以通过加一让高位的进位操作消除。
n + 1n - 1
偶数的处理:偶数的处理相对简单,直接 n / 2,直到最终为 1。
算法实现
说了这么多,我们就来实现一下这个算法。实现过程中,可以采用 贪心算法,每一步选择最优的操作来减少 n,同时我们使用 位运算 来优化 n 的判断和更新。至于复杂度嘛,可以证明这个算法的时间复杂度是 O(log n)。
代码如下:
def integerReplacement(n: int) -> int:
# 用一个变量记录替换次数
steps = 0 while n != 1:
# 如果 n 是偶数
if n % 2 == 0:
n //= 2 # 直接除以 2
else:
# 如果 n 是奇数
if (n == 3) or (n & 2 == 0): # 3 是特殊情况,直接减一比较好
n -= 1
else:
n += 1
steps += 1
return steps
代码讲解
奇偶性判断:首先通过
n % 2 == 0判断n是偶数还是奇数。如果是偶数,直接除以 2。对于奇数的优化处理:
特殊情况:当 n == 3时,直接减 1 会更好,因为3的二进制形式11直接减 1 就能变成2。其他奇数时,通过位运算 n & 2 == 0判断当前n的二进制末尾是01还是11,根据这个来选择加一还是减一。
循环条件:每次替换后,n 会减小,直到 n 变成 1,我们的操作次数就是返回的结果。
性能分析
这个算法的时间复杂度是 O(log n),因为每次我们通过除 2 或者加减 1 操作都会大大减小 n,最多需要 log n 次操作。看似有点复杂的操作,实际上通过巧妙的选择和优化,每次替换都能最大程度减少计算量。
总结
这道题的核心在于对奇数如何处理的优化,特别是对于如何选择 n + 1 或 n - 1 这个决策过程。通过位运算,我们能够更快速地判断出哪种方式能更高效地将 n 缩小到 1。
通过这种贪心的思路,我们每一步都选择最优的操作来减少 n,最终确保能在最短的步数内达到目标。
在解决这类问题时,不仅要考虑最基本的操作,还要用一些技巧来优化,避免不必要的重复计算。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。