程序员老鬼

同事在代码提交备注里写“修复了XXX的低级错误实际不是我的问题,怎么办?

刚看到个贴子,说有同事在代码提交备注里写“修复了XXX的低级错误,实际不是我的问题”,楼主很无语,不知道该怎么办。

Image

我觉得这事吧,说白了就是情绪写进了工作里,挺不专业的。

网友有的说这人玻璃心、有点小心眼,我觉得不止是性格问题,更是职场素养的问题。提交记录是团队协作的一部分,不是你发泄委屈的地方。写得越“撇清责任”,只会显得你越没有担当。

但话说回来,遇到这种人也别太上头。他这么写,反而给大家留了把柄,久而久之就知道他不好合作,自己拉低了性价比。

总的来说还是那句话:做事留痕迹,做人留余地,干活不是写日记。【备注:文末可领最新资料】

算法题:有效的数独

说实话,Java写“有效的数独”这个题目,看着好像简单,真动手的时候还是挺有讲究的。你别看它不就是个9x9的格子,判断一下是不是每行每列每个九宫格都没有重复数字——但真让你写,很多人不是判断错了位置索引,就是数组下标越界,或者直接逻辑出锅。

题目说得很清楚,给你一个部分填好的9x9数独盘,要你判断这个盘是不是“有效”,注意是“有效”,不是让你解这个盘。而且“有效”是指已经填的数字在每一行、每一列、每个3x3子宫格里都不重复。

我一开始写这个题的时候,脑子一热想用三个二维数组来记录每行、每列和每个九宫格出现的数字。后来一想,这种情况用 Set<Character> 更直观,甚至空间上都省——你不需要用一个 int[9][9] 这样的结构来记录布尔值,只要用三个 Set 的数组即可,判断重复时更高效。

上代码:

publicbooleanisValidSudoku(char[][] board){
    Set<Character>[] rows = new HashSet[9];
    Set<Character>[] cols = new HashSet[9];
    Set<Character>[] boxes = new HashSet[9];

for (int i = 0; i < 9; i++) {
        rows[i] = new HashSet<>();
        cols[i] = new HashSet<>();
        boxes[i] = new HashSet<>();
    }

for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char c = board[i][j];
if (c == '.') continue;

if (rows[i].contains(c)) returnfalse;
            rows[i].add(c);

if (cols[j].contains(c)) returnfalse;
            cols[j].add(c);

int boxIndex = (i / 3) * 3 + j / 3;
if (boxes[boxIndex].contains(c)) returnfalse;
            boxes[boxIndex].add(c);
        }
    }
returntrue;
}

这里最容易搞混的是这个 boxIndex 的计算:(i / 3) * 3 + j / 3。这玩意儿说白了就是把 (i,j) 映射到九宫格编号上。你可以理解为,每三行三列构成一个子方块,总共有9个。这个表达式就是把二维的宫格坐标压成一维。讲真,当时我写的时候还画了个格子辅助理解 😂。

说个段子,有一次我一个同事写这个题,结果用了三层循环,嵌套个 map 套 set,不但复杂还跑得贼慢,最后还把下标写错了,调了一个小时没调出来。我们看代码看得想冲过去直接 Ctrl + Z。他最后还是看了官方解法才知道自己写复杂了。

这种题目在 Java 中实现,不需要高级数据结构,也不考察递归啥的,拼的是细节能力和对数组/集合的熟练程度。你写清楚逻辑,边界处理好,不贪多贪快,结果自然不会出错。

所以别看它是个“水题”,在 Java 面试中反而很能暴露候选人的代码基本功,有没有良好的结构思维,有没有从复杂问题中抽象出模式的能力。甚至我觉得有点像“程序员眼中的九九乘法表”,基础、直白,但做得干净漂亮才叫真水平 💪。

-END-

我为大家打造了一份RPA教程,完全免费:https://www.songshuhezi.com/rpa.html

最后给大家分享一份不错的副业资料,点击下方公众号,回复关键字: 副业 领取,也可以链接我领取,微信:hls404