同学聚会,混的最好就俩人。我,大厂3-1,年薪百万;另一个老家省厅副处级,能平起平坐么?
刚刷到这个,给我看愣了一下。
高中同学聚会,有人出来排座次,说班里混得最好的就两位:一个在大厂做到3-1,年薪差不多百万;另一个回老家进了省厅,已经副处了。然后问题来了:这俩能不能算平起平坐?
下面网友一句话直接把场子掀了:谁给你的勇气,拿大厂年薪去跟省厅副处比桌位。
这事最逗的地方就在这儿。大厂那套评价体系,是钱、职级、项目、股票,听着很硬。但体制内那套,不是你报个年包就能对齐的。一个看现金流,一个看位置和资源,根本不是一张表里的数。
当然了,年薪百万也挺牛,普通人听了肯定羡慕。但你要非在同学会搞“谁更能坐主桌”,那味儿就变了。打工人再贵,也是打工人。人家那个副处,可能不怎么说话,杯子一端,旁边人已经开始客气了。
翻转字符串里的单词,别上来就把字符串整个反了
输入是这样的:
" 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])
干净,不绕。
但刷题或者面试,最好把双指针版本写熟。很多字符串题,最后不是难在算法,而是难在你对边界下标有没有真的算清楚。