程序员老鬼

刚到新公司新同事就让我请客,还指定2888元的海鲜套餐~

刚入职第一天,工牌还没捂热,同事先把你当冤种安排上了:请客,还是2888的海鲜套餐。

Image

这种局最烦的不是贵,是默认你得懂事。你不请,显得不合群

说白了,有些人欢迎新人是假,借机薅一顿是真。

评论区也有人说,这种开口就点贵价套餐的,后面大概率还会拿“团队氛围”压你。还有人更直接:这不是聚餐,这是入职保护费。

我看这种公司,味儿已经出来了。正常团队最多AA,或者老员工做东意思一下,哪有新人刚落地先交海鲜税的。

你这顿要是硬着头皮请了,后面奶茶、下午茶、生日局,估计一茬接一茬,钱包先转正了,人还没转正。

面试题:自除数

这题别一上来就枚举每一位然后写一堆 if。题目叫自除数,说白了就一件事:一个数的每一位都得能整除它自己,而且不能出现 0。0 这个地方最容易漏,一漏就不是 WA 一两个点,基本整题都不对。

比如 128,拿 1、2、8 去除,128 % 1 == 0,128 % 2 == 0,128 % 8 == 0,算。 但 120 不行,不是因为 2 不整除,是因为它里面带了个 0,这位根本没法当除数。

这种题我一般不先想“怎么优化”,先把判断函数写干净。范围遍历本身没什么花活,关键是这个数到底是不是自除数。

classSolution{
public List<Integer> selfDividingNumbers(int left, int right){
        List<Integer> ans = new ArrayList<>();
for (int num = left; num <= right; num++) {
if (isSelfDividing(num)) {
                ans.add(num);
            }
        }
return ans;
    }

privatebooleanisSelfDividing(int num){
int x = num;
while (x > 0) {
int digit = x % 10;
if (digit == 0 || num % digit != 0) {
returnfalse;
            }
            x /= 10;
        }
returntrue;
    }
}

这段代码其实就做了两件事。

第一,x % 10 不断拆出个位。 第二,拆出来立刻判:如果当前位是 0,直接 false;不是 0 再看原数能不能整除这一位。

这里有个细节,很多人第一次写会把 num 也一路除下去,最后把原始值弄丢了。这个题里最好单独搞个 x 来做位数拆解,num 留着做整除判断,脑子会清楚很多。

拿 36 走一遍就很顺:

int num = 36;
int x = num;

digit = 6;  // 36 % 10
36 % 6 == 0

x = 3;
digit = 3;
36 % 3 == 0

所以 36 是自除数。

再看 26:

digit = 6;
26 % 6 != 0;

第一位就挂,没必要继续看,直接返回 false。

这题时间复杂度也很直白。区间里每个数都检查一次,每次检查它的位数,复杂度大概就是 O(n * k),n 是区间长度,k 是数字位数。因为位数本来就不大,这种写法已经够用了,没必要为了这种题硬搞什么预处理,最后把代码写得比题目还复杂。

真正容易出错的就两个点:

一个是忘了判 digit == 0。 另一个是拿拆过的数去做取模,结果逻辑跑偏。

这题不难,但很适合看一个人写代码是不是利索。该提前返回的时候别拖,该保留原值的时候别乱改。小题往往就卡这种手感。参考气质校准见