Python技术迷

面了一个28岁的候选人,某大厂T5,跳槽预期65k~

面了个28岁的候选人,某大厂T5,开口就是65k。搁以前我可能先吸一口凉气,现在一看简历,又觉得人家真不是乱喊价。

Image

985硕,4年经验,数据也漂亮。面下来感觉也还行,逻辑在线,技术不虚,对业务还门儿清。你说这种人值不值?

说实话,值。问题也偏偏卡在这儿:他值,那公司里那些32岁、35岁的老同事,该怎么算?

所以你看,你以为在看别人谈薪,结果看着看着,像在照镜子。

算法题:转置文件

这题叫“转置文件”,看着像字符串题,真上手写的时候,坑基本都在输入不规整上。

先说现象。文件里每一行代表一条记录,行内按空格分隔。目标不是把字符转置,而是把“第 1 列、第 2 列……”重新按行输出。比如原文件是这样:

name age city
tom 18 sh
lucy 20 bj

转完以后要变成:

name tom lucy
age 18 20
city sh bj

这题如果只盯着“转置”两个字,很容易一上来就手写双层循环,最后把边界绕晕。实际做的时候,我更习惯先把数据读成二维数组,再按列取值。

先看核心代码:

deftranspose_lines(lines: list[str]) -> list[str]:
    rows = [line.strip().split() for line in lines if line.strip()]
ifnot rows:
return []

    col_count = len(rows[0])
    result = []

for row in rows:
if len(row) != col_count:
raise ValueError(f"列数不一致,期望 {col_count},实际 {len(row)}")

for col in range(col_count):
        current = []
for row in range(len(rows)):
            current.append(rows[row][col])
        result.append(" ".join(current))

return result

这里真正要稳住的不是循环本身,而是这句:

if len(row) != col_count:
raise ValueError(...)

因为线上文件、测试文件、手工改过的文件,经常不是那么整齐。你以为每行 4 列,结果某一行少一个字段,直接按下标取值就炸了。算法题平台的数据一般比较干净,但自己写代码时,最好别默认输入永远正确。

再补一个直接读文件的版本,能跑:

deftranspose_file(path: str) -> None:
with open(path, "r", encoding="utf-8") as f:
        lines = f.readlines()

for line in transpose_lines(lines):
        print(line)


if __name__ == "__main__":
    transpose_file("input.txt")

如果想再短一点,Python 其实有个很顺手的写法:

deftranspose_lines_v2(lines: list[str]) -> list[str]:
    rows = [line.strip().split() for line in lines if line.strip()]
return [" ".join(col) for col in zip(*rows)]

这题本质上不难,时间复杂度就是 O(m*n),m 是行数,n 是列数,空间复杂度也差不多。难点不在算法多高级,而在你有没有把“文件”当文件处理,而不是把它想成一组永远完美的测试数据。

很多题写到最后,差距其实就在这些小地方。能过题是一回事,代码拿去直接处理文件还能稳住,是另一回事。