程序员老鬼

公司宣布破产,每人拿了70000元补偿金。就在大家收拾准备走人时,结果老板说:有个新公司谁愿意去?工资翻倍,但必须自愿放弃赔偿金。

我在网上看到个帖子,真把我这个打工人看愣了:公司刚宣布破产,员工每人先拿7万补偿,大家正忙着清桌子、拔网线、顺手把工位绿萝都想好归谁了,老板突然来一句:我这边还有个新公司,谁愿意过去,工资翻倍,但补偿金得自愿放弃。

Image

这话一出,味儿就不对了。表面看像发福利,细品像在考大家的求生欲。

站在员工角度,这事真得掰开算。7万是落袋为安,翻倍工资听着香,可新公司能干多久、会不会又来一遍“梅开二度”,谁心里都得打个问号。打工人最怕的不是画饼,是饼刚咬一口,锅都被端走了。

要我说,这种时候别光听“工资翻倍”四个字上头,先看合同、看保障、看新公司的底子。毕竟钱进兜里,晚上睡觉都踏实

面试题:转置文件

题目叫“转置文件”,乍一看像矩阵题,其实更像一道文本处理题。

常见输入是一个文本文件,每一行有若干个单词,单词之间用空格分隔。现在要求把这个“按行排”的内容,转成“按列排”。比如文件里是:

name age city
tom 18 shanghai
jack 20 beijing

转置后就变成:

name tom jack
age 18 20
city shanghai beijing

这题真正麻烦的地方不在“转置”两个字,而在文件读取细节。因为你拿到的不是一个标准二维数组,而是一行一行读出来的字符串。先拆分、再收集、最后按列输出,这个过程要自己补齐。

我自己做这题时,一般先不急着优化,先把结构跑通:把每一行拆成数组,放进 List<String[]>,然后统计最大列数,最后按列遍历。

核心代码可以这么写:

import java.nio.file.*;
import java.io.IOException;
import java.util.*;

publicclassMain{
publicstaticvoidmain(String[] args)throws Exception {
        List<String> lines = Files.readAllLines(Paths.get("input.txt"));
        List<String[]> rows = new ArrayList<>();

int maxCol = 0;
for (String line : lines) {
            String[] parts = line.trim().split("\\s+");
            rows.add(parts);
            maxCol = Math.max(maxCol, parts.length);
        }

        StringBuilder ans = new StringBuilder();
for (int col = 0; col < maxCol; col++) {
for (int row = 0; row < rows.size(); row++) {
if (col < rows.get(row).length) {
if (ans.length() > 0 && ans.charAt(ans.length() - 1) != '\n') {
                        ans.append(' ');
                    }
                    ans.append(rows.get(row)[col]);
                }
            }
            ans.append('\n');
        }

        System.out.print(ans);
    }
}

这段代码不复杂,但有两个点要注意。

第一个是分隔符不能直接写成 " "。题目里的文件经常不是老老实实一个空格,有时候是多个空格,甚至带一点前后空白,所以我这里用了 split("\\s+")。这个写法更稳,线上处理日志文件时我也经常这么干。

第二个是每一行的列数不一定一样。转置时不能默认 rows.get(row)[col] 一定存在,所以要先判断:

if (col < rows.get(row).length) {
    ans.append(rows.get(row)[col]);
}

这一步其实就是在防数组越界。算法题里这叫边界处理,真到实际项目里,就是少打一条异常日志。

如果题目数据量比较大,不建议一次性把整个文件都读成很重的对象再做很多次拼接,不过这道题通常数据规模有限,这种写法已经够用了。时间复杂度基本就是遍历所有单词一次,量级是 O(m * n),这里的 m 是行数,n 是最大列数。

这题挺适合拿来练“把文件数据抽象成二维结构”的能力。表面上是字符串处理,往后走一步,其实就是按坐标重组数据。写顺了以后,你会发现很多日志整理、配置转换的小工具,思路都差不多。