Python技术迷

纠结了 ,外企外包30k ,外企甲方19k 但是感觉都不太稳定,不知道选哪个了..

外企外包30k,听着香,钱给得也确实猛一点。但问题是外包这俩字摆在那儿,很多时候你人坐在甲方办公室,活没少干,归属感没有,福利差一截,裁人的时候还可能先从你这边动刀。

Image

外企甲方19k,钱一下少了11k,肉疼是真的。别说什么平台好、身份稳,19k和30k差的不是奶茶钱,是每个月一大块现金流。房租房贷、家里开销一摆,谁都得沉默。

但这事也不能光看数字。30k如果是纯消耗你、项目一黄就走人,那就是拿不稳定换高薪。19k如果能进核心团队,福利正常,后面还有涨薪空间,那也不是不能忍。

我觉得最关键得问一句:你现在缺的是钱,还是缺一个稍微能喘口气的位置。别被“外企”俩字晃住,外企现在也不是铁饭碗了。

今日算法题

右旋字符串,坑一般不在切片上

字符串右旋最容易写错的地方,不是 Python 不会写,而是很多人默认 k 一定比字符串长度小。

这地方我第一眼就不太信。

题目说右旋,比如:

s = "abcdefg"
k = 2

右旋 2 位以后,后面的 "fg" 被挪到前面,结果是:

"fgabcde"

这题看着很短,但线上写字段脱敏、日志尾部截取、环形队列展示时,经常就是这种小逻辑出问题。尤其是 k=0、k=len(s)、k > len(s) 这几种边界,代码一毛躁就翻车。

我一般先把 k 处理掉:

k = k % len(s)

这行别省。

比如字符串长度是 7,右旋 9 位,实际效果跟右旋 2 位一样。你不取模,后面切片虽然在 Python 里不一定报错,但结果很容易不是你想要的。

最直接的写法就是切片:

defrotate_right(text: str, step: int) -> str:
ifnot text:
return text

    offset = step % len(text)
if offset == 0:
return text

    tail = text[-offset:]
    head = text[:-offset]
return tail + head

这段代码没什么花活,但判断顺序我会这么放。

先挡空字符串,因为空字符串不能取模,step % len(text) 会直接炸。然后处理 offset == 0,这种情况没必要再拼一次字符串。

跑几组看一下:

cases = [
    ("abcdefg", 2),
    ("abcdefg", 7),
    ("abcdefg", 9),
    ("a", 100),
    ("", 3),
]

for text, step in cases:
    print(text, step, "=>", rotate_right(text, step))

输出应该是:

abcdefg 2 => fgabcde
abcdefg 7 => abcdefg
abcdefg 9 => fgabcde
a 100 => a
 3 => 

有些题目不让用额外字符串,或者明确要求在原字符数组上操作,这时候就不能直接 tail + head 了。这个限制在 Python 里有点别扭,因为字符串本身不可变,只能先转成列表。

现场一般用“三次反转”。

右旋 k 位,其实可以这么拆:

abcdefg
先整体反转:gfedcba
再反转前 k 个:fgedcba
再反转后面部分:fgabcde

代码写出来是这样:

defrotate_right_inplace(chars: list[str], step: int) -> None:
ifnot chars:
return

    offset = step % len(chars)
if offset == 0:
return

defreverse_range(left: int, right: int) -> None:
while left < right:
            chars[left], chars[right] = chars[right], chars[left]
            left += 1
            right -= 1

    reverse_range(0, len(chars) - 1)
    reverse_range(0, offset - 1)
    reverse_range(offset, len(chars) - 1)

用一下:

buf = list("abcdefg")
rotate_right_inplace(buf, 2)
print("".join(buf))

结果:

fgabcde

切片写法适合面试里快速交答案,也适合平时业务代码,短、清楚、不绕。

三次反转适合题目强调“原地修改”的场景。它的时间复杂度是 O(n),额外空间如果不算输入数组,就是 O(1)。

这题别背模板,记住两个点就够了:先把 k 取模,空字符串单独挡掉。剩下的,不过就是把尾巴搬到前面。