因为狐臭被公司开除了~
刚刷到这个帖子,居然因为狐臭被公司开除了~
人家都快转正了,工作认真,业绩也不差,结果临门一脚,人事过来一句“明天不用来了”,理由还是身上有味儿。你说尴尬肯定尴尬,办公室环境大家也得顾着点,这个能理解,但直接开人就挺离谱的。
要我说,真觉得影响同事,不能先好好沟通吗?提醒一下,给点时间处理,换工位、通风、请假治疗,这些办法一个都不试,上来就让人走,HR自己说出口不别扭吗。
更难受的是当事人还在怀疑自己:我以后是不是找不到工作了。其实真没必要把自己打死。身体问题可以慢慢处理,但这种公司,连基本尊重都没有,留下来也未必是什么好地方。
字符串反转这题,一眼看上去没东西,真写的时候反而容易暴露习惯。
有些人上来就 new 一个数组,再从后往前拷贝。能过,但我一般不这么写。题目如果给的是 char[],大概率就是想让你原地改。你再开一份空间,面试官嘴上不说,心里已经给你记了一笔。
题目一般长这样:
给定一个字符数组,把里面的字符反转。要求原地修改,不能使用额外数组。
比如:
输入:['h','e','l','l','o']
输出:['o','l','l','e','h']
这题别想复杂了,两个指针就够。
一个指针从左边走,一个指针从右边走。左边字符和右边字符交换,然后左指针右移,右指针左移。直到两个指针碰上,或者错过去,就结束。
代码我一般会写成这样:
publicclassStringReverseBox{
publicvoidreverse(char[] text){
if (text == null || text.length < 2) {
return;
}
int head = 0;
int tail = text.length - 1;
while (head < tail) {
char hold = text[head];
text[head] = text[tail];
text[tail] = hold;
head++;
tail--;
}
}
}
这里有两个地方别写歪。
第一个是边界判断。
if (text == null || text.length < 2) {
return;
}
空数组、一个字符的数组,本来就不用反转。线上写工具方法时,我更愿意把这个判断放进去。算法题平台可能不会传 null,但平时写业务代码,别太相信调用方。
第二个是循环条件。
while (head < tail)
不要写成 head <= tail。写了也不一定错,因为中间那个字符和自己交换没影响,但没必要。代码里这种“多干一步但结果没错”的东西,我一般会删掉。时间久了,这类小毛边会变成习惯。
如果输入是:
char[] text = {'a', 'b', 'c', 'd', 'e'};
new StringReverseBox().reverse(text);
System.out.println(java.util.Arrays.toString(text));
执行过程其实就两轮:
第1轮:a 和 e 换 => e b c d a
第2轮:b 和 d 换 => e d c b a
中间的 c 不用管,它本来就在反转后的中间位置。
这题的复杂度也没什么花活。
数组里每个字符最多被访问一次,时间复杂度是 O(n)。只用了几个变量,没有额外数组,空间复杂度是 O(1)。
有人会问,Java 里能不能直接用 StringBuilder.reverse()?
可以,但那不是这道题想看的东西。比如:
String s = "hello";
String result = new StringBuilder(s).reverse().toString();
这适合业务里快速处理字符串,不适合拿来回答“原地反转字符数组”。因为 String 在 Java 里是不可变对象,你反转它,本质上一定会生成新的对象。
所以这题真正考的不是 API 熟不熟,而是你看到 char[] 之后,能不能立刻想到:别创建新数组,直接在原数组上交换。
越简单的题,越别写虚。两个指针,一次交换,边界收干净,就够了。