纠结了 ,外企外包30k ,外企甲方19k 但是感觉都不太稳定,不知道选哪个了..
外企外包30k,听着香,钱给得也确实猛一点。但问题是外包这俩字摆在那儿,很多时候你人坐在甲方办公室,活没少干,归属感没有,福利差一截,裁人的时候还可能先从你这边动刀。
外企甲方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 取模,空字符串单独挡掉。剩下的,不过就是把尾巴搬到前面。