靠AI作弊上岸字节的同学,被开了~
刚刷到这个帖子,真给我看乐了。
有网友吐槽,说班里有个同学,秋招一路杀进字节后端,拿的还是SP。问题是这哥们儿平时在学校存在感很低,小组作业常年划水,刷题记录也没几天是亮的。结果面试一面二面三面全过,当时全班还以为他突然开窍了。
后来才知道,面试那套估计没少靠AI救场,回答听着挺像那么回事,真上手写代码就露馅了。
入职没多久,mentor让他改个普通bug,他硬是卡半天。写需求也慢,问基础也虚,组里估计越看越不对劲。最后人被开了,班里知道后都沉默了一下。
这事最搞的地方在于,AI能帮你把面试糊过去,但不能替你天天坐在工位上交活啊。面试官被忽悠一次可以,代码仓库不会陪你演。
两个字符串摆在那,最容易写错的不是交换逻辑,而是 s == goal 这一刀。
我见过不少代码,上来就找不同位置,发现没有不同,就直接返回 True。这地方我第一眼就不太信。
题目说的是:必须交换一次。
不是“不交换也行”。
比如:
s = "ab"
goal = "ab"
这俩字符串一样,但你随便交换一次,只能变成 "ba",所以结果应该是 False。
可如果是:
s = "aa"
goal = "aa"
这就能成立。交换两个 a,字符串看起来没变,但动作确实发生了。
这题真正要盯住两个分支。
长度不一样,别想了,直接 False。
长度一样后,如果两个字符串本来相等,就看 s 里面有没有重复字符。只要有重复字符,就能交换这两个相同字符,交换完还是原样。
如果两个字符串不相等,那就把所有不同的位置找出来。只能有两个不同位置,多一个少一个都不行。
比如:
s = "ab"
goal = "ba"
不同位置是 0 和 1。
只要满足:
s[0] == goal[1]
s[1] == goal[0]
说明交换这两个位置就能对上。
代码我会这么写,不绕:
defbuddy_strings(s: str, goal: str) -> bool:
if len(s) != len(goal):
returnFalse
if s == goal:
seen = set()
for ch in s:
if ch in seen:
returnTrue
seen.add(ch)
returnFalse
diff = []
for i, (left, right) in enumerate(zip(s, goal)):
if left != right:
diff.append(i)
# 超过两个位置已经没戏了,没必要继续扫
if len(diff) > 2:
returnFalse
if len(diff) != 2:
returnFalse
i, j = diff
return s[i] == goal[j] and s[j] == goal[i]
这里有个小细节,diff 超过 2 个位置时可以提前返回。
不是为了炫技,是因为交换一次最多只影响两个位置。三个位置不同,后面再怎么扫也救不回来。
跑几个容易卡人的例子:
cases = [
("ab", "ba"), # True
("ab", "ab"), # False
("aa", "aa"), # True
("abcd", "badc"), # False
("aaaaabc", "aaaaacb"), # True
]
for s, goal in cases:
print(s, goal, buddy_strings(s, goal))
输出大概是:
ab ba True
ab ab False
aa aa True
abcd badc False
aaaaabc aaaaacb True
这题别写复杂了。
判断点就两个:字符串相等时看重复字符;字符串不等时看不同位置是不是刚好两个,并且交叉相等。
很多错解,基本都死在第一种情况。