Python技术迷

离职电脑没清干净,技术员用恢复软件把和新公司的聊天、项目资料全挖了出来。公司拿着这些证据索赔,姑娘当场崩溃赔到倾家荡产!

刚看到个贴子,说上海有个姑娘离职时电脑只点了“格式化”,结果公司技术员用恢复软件把她和新公司的聊天、资料全挖出来,最后公司拿着证据索赔,她当场崩溃 💔。

Image

这事关键在于信息安全意识太薄弱。很多人以为清空=删除,其实就像把书架上的目录纸撕了,但书还在格子里,随便找个人就能翻出来 。网友们有的同情姑娘,也有人觉得她有点大意,毕竟涉及新东家资料,本来就挺敏感。

从我的角度看,离职不光是交接工作,也是保护自己的过程。重要资料最好物理销毁,或者用专业工具彻底清除。说到底,公司能不能讲情面是一回事,但个人要有底线的安全感。

这件事提醒我们:职场不只是拼能力,还要懂规则,守好边界,别因为一时疏忽付出无法承受的代价。【备注:文末可领最新资料】

面试题:两数相除

前两天有朋友问我那个“两数相除”的算法题,说自己老是被整懵,其实这题看起来挺直白的,但真要写代码,尤其是不用乘法、除法和取余操作的时候,就会觉得脑子打结。我今天就用 Python 来讲一讲,尽量说得通俗点,别搞得像数学课一样枯燥。

先说题目本身:给你两个整数 dividend 和 divisor,你要返回它们相除的商,但不能直接用 / 或 %。这就意味着咱得自己想办法模拟除法过程。还得注意几个点:

  1. 结果要往 0 方向截断,比如 -7/3 = -2;
  2. 考虑溢出情况,比如 -2**31 / -1 这种在 32 位整数里会爆掉;
  3. 正负号别搞错了。

最朴素的做法呢,就是一个一个减。比如 15 除以 3,你就不停地做 15-3-3-3...直到小于 3 为止,数一数减了几次。但问题是,万一你是 2**31 这样的数,被 1 除,减完人都傻了,时间复杂度直接爆炸。

于是有了“倍增”这个思路。就像咱买东西,商家会说“买二赠一”,其实就是翻倍嘛。比如 15 除以 3,你可以先让 3 翻倍成 6,再翻倍成 12,发现下一个 24 就超过 15 了,那就停下。此时说明 3 × 4 = 12 是可以整除的,余下 15-12=3,再来一轮。最后得到的结果就是 4+1=5。这样比一个个减要快得多。

实现的时候呢,通常有这么几步:

defdivide(dividend: int, divisor: int) -> int:
# 处理溢出边界
if dividend == -2**31and divisor == -1:
return2**31 - 1

# 确定结果的正负号
    sign = -1if (dividend < 0) ^ (divisor < 0) else1

# 转换成正数方便处理
    a, b = abs(dividend), abs(divisor)
    result = 0

# 核心逻辑:倍增减法
while a >= b:
        temp, multiple = b, 1
while a >= (temp << 1):
            temp <<= 1
            multiple <<= 1
        a -= temp
        result += multiple

return sign * result

这里的 temp <<= 1 就是让除数翻倍,multiple 是记录当前翻倍的倍数。这样一层层扣下来,效率就高多了,时间复杂度大概是 O(logN)。


顺便说一下调试的时候我踩过的坑。有次我把符号处理放在最后 return 的时候写错了,结果正负全乱套。后来我干脆一开始就统一取绝对值,最后再补符号,清爽很多。还有就是那个溢出的判断,一开始我没加,结果跑测试用例直接挂。其实也很好理解:-2147483648 除以 -1,理论上应该是 2147483648,但超过了 32 位整数范围,所以得特判。

如果你现在还在用“一个一个减”的办法,那建议你赶紧改成倍增,不然大数的时候真会卡半天。而且写这种题,其实核心考察的不是数学,而是你能不能想到用位运算去优化。移位操作在底层就是乘以 2 或除以 2,比循环相减要快得多。

差不多就这样吧,代码逻辑不算复杂,主要就是细节多。你要是真在面试里写,最好先说清楚思路,然后再上代码,这样即使中间有小 bug,面试官也能看到你的方向是对的。

-END-

我为大家打造了一份RPA教程,完全免费:songshuhezi.com/rpa.html

🔥虎哥私藏精品🔥

虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》,总量高达650GB,点击下方公众号回复关键字 python 全部免费领