Python技术迷

同学聚会,混的最好就俩人。我,大厂3-1,年薪百万;另一个老家省厅副处级,能平起平坐么?

刚刷到这个,给我看愣了一下。

高中同学聚会,有人出来排座次,说班里混得最好的就两位:一个在大厂做到3-1,年薪差不多百万;另一个回老家进了省厅,已经副处了。然后问题来了:这俩能不能算平起平坐?

下面网友一句话直接把场子掀了:谁给你的勇气,拿大厂年薪去跟省厅副处比桌位。

Image

这事最逗的地方就在这儿。大厂那套评价体系,是钱、职级、项目、股票,听着很硬。但体制内那套,不是你报个年包就能对齐的。一个看现金流,一个看位置和资源,根本不是一张表里的数。

当然了,年薪百万也挺牛,普通人听了肯定羡慕。但你要非在同学会搞“谁更能坐主桌”,那味儿就变了。打工人再贵,也是打工人。人家那个副处,可能不怎么说话,杯子一端,旁边人已经开始客气了。

今日算法题

翻转字符串里的单词,别上来就把字符串整个反了

输入是这样的:

"  hello   world  "

要求输出:

"world hello"

这题第一眼看着像“翻转字符串”,但真要这么写,很容易写歪。

它不是把每个字符反过来。

"hello world" -> "dlrow olleh"

这肯定不对。

它要的是单词顺序反过来,单词内部不变。另外,前后多余空格要去掉,中间多个空格最后只能保留一个。

所以这题真正烦人的地方不是翻转,而是空格处理。

我一般不会一上来就 split()[::-1],虽然 Python 这么写确实能过:

defreverse_words(s: str) -> str:
return" ".join(s.split()[::-1])

这段很短,也很 Python。

但算法题里我更建议手写一版,不然你根本没处理过边界,面试官追一句“你不用 split 怎么写”,就容易卡住。

可以从右往左扫。

为什么从右往左?因为最终结果第一个单词,正好是原字符串最后一个单词。扫到一个完整单词,就丢进结果列表里,最后用一个空格拼起来。

代码如下:

defreverse_words(s: str) -> str:
    ans = []
    i = len(s) - 1

while i >= 0:
# 跳过右侧空格
while i >= 0and s[i] == " ":
            i -= 1

if i < 0:
break

# 找当前单词的左边界
        end = i
while i >= 0and s[i] != " ":
            i -= 1

        ans.append(s[i + 1:end + 1])

return" ".join(ans)

拿一组带坑的输入跑一下:

text = "   Python   is   good  "
print(reverse_words(text))

输出:

good is Python

这里有几个细节别漏。

第一个 while 是吃掉空格的,不管是末尾空格,还是两个单词中间多出来的空格,都靠它过滤掉。

end = i 这行要在找到单词结尾之后立刻记下来。否则继续往左扫,右边界就丢了。

最后 s[i + 1:end + 1] 这里也容易写错。因为第二个循环停下来的时候,i 要么指向空格,要么已经变成 -1,真正的单词起点是 i + 1。

这题的时间复杂度是 O(n),每个字符最多被扫一遍。额外空间主要是结果数组,算 O(n)。

如果只是日常写业务脚本,我会直接用:

" ".join(s.split()[::-1])

干净,不绕。

但刷题或者面试,最好把双指针版本写熟。很多字符串题,最后不是难在算法,而是难在你对边界下标有没有真的算清楚。