Python技术迷

靠AI作弊上岸字节的同学,被开了~

刚刷到这个帖子,真给我看乐了。

有网友吐槽,说班里有个同学,秋招一路杀进字节后端,拿的还是SP。问题是这哥们儿平时在学校存在感很低,小组作业常年划水,刷题记录也没几天是亮的。结果面试一面二面三面全过,当时全班还以为他突然开窍了。

Image

后来才知道,面试那套估计没少靠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

这题别写复杂了。

判断点就两个:字符串相等时看重复字符;字符串不等时看不同位置是不是刚好两个,并且交叉相等。

很多错解,基本都死在第一种情况。