Python技术迷

上海国企的月薪,大家觉得如何?到手15k,年终8万,双边公积金6k

刚刷到这个帖子,我第一反应是:这还问“如何”?多少人看完得沉默半天。

上海国企,到手15k,年终8万,双边公积金6k,这配置放出来,评论区肯定两拨人。一拨说“也就那样,上海消费高”,另一拨已经开始翻自己工资条了。

Image

关键是这玩意儿不是只看月薪。到手15k已经不低了,年终再来8万,公积金还这么厚,等于你眼前的钱、年底的钱、以后买房的钱,全都给你垫了一层。很多打工人嘴上嫌弃国企涨薪慢,真看到这种待遇,手里的简历估计都想自己投过去。

当然,国企也有国企的烦,流程多、节奏慢、事儿磨人。但这份收入摆在上海,真别装看不上。至少比一堆996画饼公司强太多了。HR看完都得小声问一句:还招人吗?

今日算法题

反转字符串,别一上来就 [::-1]

这题我见过不少人写崩。

输入是这样的:

s = ["h", "e", "l", "l", "o"]

要求反转后变成:

["o", "l", "l", "e", "h"]

看着简单,很多人第一反应就是:

s = s[::-1]

这行代码当然能把字符串切片反过来,但放在这道题里,我第一眼就不太信。因为题目一般会要求原地修改,也就是不能重新搞一个列表再赋值。

这个坑很小,但面试里很容易被抓。

你写 s = s[::-1],只是让局部变量 s 指向了一个新列表。外面的原列表其实没被你真正改掉。

可以简单测一下:

defreverse_wrong(s):
    s = s[::-1]

data = ["a", "b", "c"]
reverse_wrong(data)
print(data)

输出还是:

['a', 'b', 'c']

这地方就别跟面试官解释 Python 变量引用了,代码已经说明问题。

这题我一般就用双指针,不绕。

defreverse_string(chars):
    left = 0
    right = len(chars) - 1

while left < right:
        chars[left], chars[right] = chars[right], chars[left]
        left += 1
        right -= 1

跑一下:

s = ["h", "e", "l", "l", "o"]
reverse_string(s)
print(s)

结果:

['o', 'l', 'l', 'e', 'h']

这个写法没什么花活,就是从两边往中间换。

第一次交换 h 和 o,第二次交换 e 和 l,中间那个 l 不用管。指针相遇或者错过,循环就停。

时间复杂度是 O(n),因为每个字符最多被访问一次。

空间复杂度是 O(1),因为没有新建跟输入规模相关的数组。

这题真正要注意的不是“会不会反转”,而是你有没有看清楚题目里的“原地”。

如果题目给的是字符串:

text = "hello"

那就不一样了。Python 里的字符串不能原地改,必须转成列表,或者直接返回新字符串:

defreverse_text(text):
    chars = list(text)

    left, right = 0, len(chars) - 1
while left < right:
        chars[left], chars[right] = chars[right], chars[left]
        left += 1
        right -= 1

return"".join(chars)

测试:

print(reverse_text("hello"))

输出:

olleh

所以这题别背答案。

看到输入是 list[str],优先想原地交换。

看到输入是 str,先想清楚字符串不可变,别硬改。

这类简单题,错的地方往往不是算法,而是边界和题意。