程序员老鬼

月薪20k挖过来一个同事,入职不到一个月,被领导斥责能力不行,让马上转岗!结果同事回怼:不是我能力不行,是你不会用人!

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

公司花20k挖了个同事过来,结果人家入职还不到一个月,领导就开始拍桌子,说能力不行,赶紧转岗。换谁都得懵吧?业务没摸熟,流程没跑明白,连人和系统都没认全,就已经被下结论了。

Image

更绝的是,这同事也没忍,直接回了一句:不是我能力不行,是你不会用人。

这话确实挺冲,但也不算没道理。高薪把人挖来,岗位怎么安排、目标怎么定、资源给不给,这些都没整明白,最后一句“能力不行”就想打发了。

有些领导招人像开盲盒,拆开不是自己想要的,就开始怪盒子……

今日面试题

一道看着要枚举的 RGB 颜色题,实际只需要算三次

输入颜色是 #09f166,要求找一个最相似的简写颜色。

所谓简写颜色,就是每两个十六进制字符必须相同,例如:

#11ee66
#aabbcc
#ffffff

第一眼看到“最相似”,很容易顺手写三层循环,把 00、11、22……ff 全部枚举一遍。总共也就 16³ 种颜色,确实能过。

但这题没必要绕这么大一圈。

RGB 三个通道互不影响,颜色距离又是三个通道差值平方之和。把红色调到最近值,不会影响绿色和蓝色,所以分别处理三个通道就行。

拿红色通道 09 来看:

十六进制 09 = 十进制 9

简写颜色允许的通道只有:

00、11、22、33……ff

转成十进制就是:

0、17、34、51……255

也就是说,我们只需要找到距离当前值最近的 17 的倍数。

9 离 0 的距离是 9,离 17 的距离是 8,所以红色应该改成 11。

绿色 f1 是十进制 241,最近的是 238,也就是 ee。蓝色 66 本身就是合法值,不需要动。

最后结果是:

#11ee66

Java 代码我会这样写:

publicclassSimilarRgbColor{

public String similarRGB(String color){
        StringBuilder answer = new StringBuilder("#");

for (int pos = 1; pos < color.length(); pos += 2) {
int channel = Integer.parseInt(
                    color.substring(pos, pos + 2), 16
            );

int level = (channel + 8) / 17;
if (level > 15) {
                level = 15;
            }

char hex = toHex(level);
            answer.append(hex).append(hex);
        }

return answer.toString();
    }

privatechartoHex(int value){
return value < 10
                ? (char) ('0' + value)
                : (char) ('a' + value - 10);
    }
}

这里最值得看的是这一行:

int level = (channel + 8) / 17;

普通整数除法会直接向下取整,比如 16 / 17 得到 0,但 16 显然离 17 更近。

所以除之前加 8,相当于给它做四舍五入。为什么是 8?因为相邻两个合法值相差 17,中间分界点就在 8 和 9 附近。

算出 level 后,它的范围是 0~15。这个数字正好也是十六进制单字符的范围,再连续写两次,就能得到 00、11、22……ff。

时间复杂度没什么可说的,RGB 固定只有三个通道,实际就是常数时间,额外空间也只有最终返回的字符串。

这题容易写复杂,不是算法有多难,而是“颜色”两个字容易把人带偏。把十六进制拆开看,它其实只是找最近的 17 倍数,算三次就结束了。