程序员老鬼

被裁了,给了我2个选择,拿裁员n+1就是两个月工资离职证明会写被裁。。

人家刚被谈完裁员,摆面前两个选项。要么继续打卡混到月底,工资照发,剩下时间自己找工作;要么直接拿补偿走人,大概两个月工资,但离职证明上会写裁员

Image

HR还说什么“前面的人都选第一个”,还提醒一句,最好考虑下离职证明。听着像建议,其实就是想让你自己掂量,别让公司多掏钱。

但问题是,现在这个行情,被裁真的还算什么黑点吗?大厂裁,小厂也裁,谁面试没见过几个“组织调整”的。真要说难听点,公司都把人优化了,还指望员工替公司省成本,多少有点过分。

我觉得这网友想选第二个没毛病。钱是实打实的,离职证明那几个字,很多时候没你想的那么吓人。怕就怕你为了一个“看起来好看”的证明,白白少拿一笔补偿。打工人都到这一步了,先把该拿的钱拿稳吧。

今日面试题

替换数字这题,别一上来就想着 replaceAll

字符串里混着字母和数字,要求把每个数字替换成 number。

比如:

输入:a1b2c3
输出:anumberbnumbercnumber

这题第一眼看着挺像送分题,直接 replaceAll("\\d", "number") 不就完了?

我一般不太建议算法题这么写。

不是说不能过,而是这类题真正考的不是正则,是你对字符串扩容、拷贝次数、指针位置的控制。线上写工具脚本可以偷懒,刷算法题这里最好别偷。

Java 里 String 是不可变的。

你要是这样写:

s = s.replace("1", "number");
s = s.replace("2", "number");

看着没几行,实际每次都会生成新字符串。字符串一长,这种写法就有点蠢了。

这题我会先扫一遍原字符串,碰到数字就追加 number,碰到字母就原样追加。别整复杂了。

代码可以这样写:

import java.util.Scanner;

publicclassMain{

publicstaticvoidmain(String[] args){
        Scanner scanner = new Scanner(System.in);
        String text = scanner.next();

        StringBuilder builder = new StringBuilder();

for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);

if (c >= '0' && c <= '9') {
                builder.append("number");
            } else {
                builder.append(c);
            }
        }

        System.out.println(builder.toString());
    }
}

这里有个小细节,我没有用 Character.isDigit(c)。

不是它不行,而是这道题通常限定输入是小写字母和数字,用 c >= '0' && c <= '9' 更直接,也少一点不必要的语义扩展。算法题里,输入范围已经给了,就按输入范围写,别自己加戏。

再看复杂度。

原字符串长度是 n,只遍历一遍,所以时间复杂度是 O(n)。

空间上用了一个 StringBuilder 存结果,最坏情况下整个字符串全是数字,每个字符都会变成 6 个字符的 number,所以额外空间也是 O(n) 级别。这里别纠结那个 6,复杂度不看常数。

如果想写得再稳一点,可以提前给 StringBuilder 一个容量,避免它扩容。

StringBuilder builder = new StringBuilder(text.length() * 2);

但这个容量不一定准。全是数字时肯定还会扩容。

更严谨一点,可以先数数字个数:

int digitCount = 0;
for (int i = 0; i < text.length(); i++) {
char c = text.charAt(i);
if (c >= '0' && c <= '9') {
        digitCount++;
    }
}

StringBuilder builder = new StringBuilder(
        text.length() + digitCount * 5
);

为什么是乘 5?

因为一个数字原本占 1 个字符,替换成 number 后占 6 个字符,相当于额外多了 5 个字符。

不过这题一般没必要写这么满。面试或者笔试时,第一版代码清楚、边界没错,已经够了。

这题最容易犯的错,不是不会写,而是把简单题写得太花。

正则、递归、数组搬移,全都没必要。

扫一遍,遇数字换,遇字母留。

就这么点事。