Python技术迷

讯飞有个妹子中了1000万大乐透,奖金都不要了,立马离职走人

一听这事,我第一反应不是羡慕,是“这班得上得多憋屈,才会连1000万奖金都懒得折腾,先把离职办了再说”。

网友说得也挺损,有人调侃:“这不是中大奖,这是工位原地超度。” 还有人补刀:“说明她早就不想干了,彩票只是按下发送键。” 你别说,这味儿太真实了。

Image

很多人总以为,打工人真发财了,第一件事是买房买车。其实未必。真被工作磨到头皮发麻的人,脑子里先蹦出来的,经常是——我终于不用看群消息了,不用写周报了,不用听人开会讲半天废话了。

所以这新闻最好笑的点,不是1000万,是“奖金都不要了,立马走人”。钱还没完全落袋,人先从系统里退出登录。

说明有些班,真不是钱多钱少的问题,是多看一眼都烦。

算法题:整数转换英文表示

不是不会写,是很多人一上来就把这题写成了查表游戏。123 -> one hundred twenty three 看着不难,真下手时最容易乱在两个地方:一是 10~19 这段不规整,二是大数分组以后,哪些组该跳过,哪些组要补单位,代码一不收敛就开始满屏 if else。这种题我一般先不急着拼整句,先把“千以内”收拾干净,后面按三位一组往上挂 Thousand、Million、Billion 就行。这个拿来做字符串处理练手很合适,判断够多,但还没多到恶心。写法我参考了你给我的技术文那种“直接落问题、代码贴关键段”的气质来收这个稿子,整体风格做了校准。

先看最核心的一段:把 0~999 转成英文。这里别整递归套递归,层次压太深读着累,拆成个位、十几、整十、百位四段就够了。

LESS_20 = [
"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine",
"Ten", "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen",
"Sixteen", "Seventeen", "Eighteen", "Nineteen"
]

TENS = ["", "", "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety"]

defconvert_under_1000(num: int) -> str:
    parts = []

if num >= 100:
        parts.append(LESS_20[num // 100])
        parts.append("Hundred")
        num %= 100

if0 < num < 20:
        parts.append(LESS_20[num])
elif num >= 20:
        parts.append(TENS[num // 10])
if num % 10:
            parts.append(LESS_20[num % 10])

return" ".join(parts)

这段处理完,主流程就顺了。整数每三位切一刀,从低位往高位走。这里有个细节很关键:某一组是 000,直接跳过,不要硬拼单位,不然很容易出现 One Million Thousand 这种脏结果。

defnumber_to_words(num: int) -> str:
if num == 0:
return"Zero"

    units = ["", "Thousand", "Million", "Billion"]
    parts = []
    idx = 0

while num > 0:
        chunk = num % 1000
if chunk:
            text = convert_under_1000(chunk)
if units[idx]:
                text += " " + units[idx]
            parts.append(text)
        num //= 1000
        idx += 1

return" ".join(reversed(parts))

跑几个例子,基本就知道这题有没有写稳:

print(number_to_words(123))        # One Hundred Twenty Three
print(number_to_words(12345))      # Twelve Thousand Three Hundred Forty Five
print(number_to_words(1000010))    # One Million Ten
print(number_to_words(1000000))    # One Million

这题真正考的不是英语,是你能不能把规则压成几段稳定逻辑。0 单独处理;10~19 单独处理;每三位一组;空组跳过。剩下的都是体力活。

我自己更喜欢这种写法,原因很简单:排错快。哪天输出不对,先盯 convert_under_1000(),再盯分组逻辑,问题基本跑不掉。

最怕那种一把梭把所有规则揉进一个函数里,今天能过,过两天自己都不想看。技术题写代码,很多时候不是看你能不能写出来,是看你写完以后还愿不愿意认这段代码。