程序员老鬼

我一年140万 女朋友一年15万 差了快10倍了 要不要换一个?感觉差距会越来越大 还没结婚 越看越不顺眼了 谈了才两年

刚看到个贴子:男的一年收入一百四十万,女朋友一年十五万,差了快十倍,他开始嫌弃对方,纠结要不要分手。网友回帖有的骂他现实,有的劝女生早走不送。

Image

我觉得这事吧,关键不在赚多少,而在你到底把对象当“伴侣”还是“项目”。你要是真在乎这个人,收入差距是可以一起慢慢拉近的;可要是已经开始嫌弃、看不顺眼,那说明感情本身就经不起考验。今天嫌她赚得少,明天可能嫌她年龄、外貌、家庭背景,一样样都会变成理由。

换个角度想,一个肯支持你、理解你、愿意跟你一起过日子的伴侣,本身就是很大的价值。钱是会变的,人品和三观才是走得久的东西。

与其纠结要不要换女朋友,不如先想想:自己配不配让别人跟你一起扛未来。

面试题:整数反转

我跟你说个真事儿哈。前两天晚上快十一点,我在公司楼下等外卖,那会儿脑子已经有点迷糊了,手机上刷到一道老生常谈的算法题:整数反转。结果我们组那个小李在群里发了一句:”哥,你写个 Java 版讲讲呗,面试老遇到。“我外卖还没到,人先被他点名了,只能掏出电脑撸了一版。

先把题目意思说清楚,不然容易一上来就写偏了。题目大概是这样:给你一个 32 位有符号整数 x,把它的数字顺序反过来返回。 比如:

  • 123 变成 321
  • -120 变成 -21(前导 0 要被吃掉)
  • 如果反转以后超过 int 范围(也就是小于 -2^31 或大于 2^31-1),那就老老实实返回 0

听起来挺简单的对吧,但面试官就喜欢在这种“小意思”的题里藏点东西。

我先说最直觉的写法,很多人一上来就是字符串思路:变成字符串,反转,再变回数字,大概像这样:

publicintreverseByString(int x){
boolean negative = x < 0;
long num = Math.abs((long) x);
    StringBuilder sb = new StringBuilder(String.valueOf(num));
    sb.reverse();
long res = Long.parseLong(sb.toString());
if (negative) {
        res = -res;
    }
if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) {
return0;
    }
return (int) res;
}

这个写法问题也不大,面试不严格的地方能过。但是,一旦面试官一皱眉,问你:“不用字符串能不能写?”你就容易当场卡壳了。还有就是,这题本身是考你对“按位取数”和“溢出判断”的理解的,用字符串有点绕开考点那味儿。

那更“正统”的写法是啥呢?就是数学那套:不停“弹出最后一位”,然后“压入到新数的末尾”。你可以脑补一个场景:你手里有个数 123,

  • 123 % 10 = 3(拿到最后一位)
  • 123 / 10 = 12(剩下前面的) 然后你维护一个结果 res,一开始是 0:
  • 第一次:res = 0 * 10 + 3 = 3
  • 再拿 12 的最后一位:2 → res = 3 * 10 + 2 = 32
  • 再拿 1 → res = 32 * 10 + 1 = 321

负数也一样,Java 的 % 和 / 对负数也能这么玩,不用特意拆符号,当然你要注意溢出。

关键点其实就俩字:溢出。 我们在算 res * 10 + digit 的时候,有可能已经超过了 int 能装的范围,这时候不能算完再去发现太大了,那已经晚了,要在计算前就拦住。

所以就有了这段经典的判断逻辑:

  • 如果 res > Integer.MAX_VALUE / 10,那你再乘 10 肯定炸
  • 如果 res == Integer.MAX_VALUE / 10,那你还要看 digit,再加上去可能刚好或超过 负数同理。

我给你贴个我比较习惯的 Java 版本,面试可以直接背几遍:

publicclassSolution{

publicintreverse(int x){
int res = 0;
while (x != 0) {
int digit = x % 10;   // 弹出最后一位
            x = x / 10;           // 去掉最后一位

// 这里做溢出判断(正数边界)
if (res > Integer.MAX_VALUE / 10
                    || (res == Integer.MAX_VALUE / 10 && digit > 7)) {
return0;
            }
// 这里做溢出判断(负数边界)
if (res < Integer.MIN_VALUE / 10
                    || (res == Integer.MIN_VALUE / 10 && digit < -8)) {
return0;
            }

            res = res * 10 + digit;   // 把当前位“压”到结果后面
        }
return res;
    }

publicstaticvoidmain(String[] args){
        Solution s = new Solution();
        System.out.println(s.reverse(123));      // 321
        System.out.println(s.reverse(-120));     // -21
        System.out.println(s.reverse(1534236469)); // 溢出 → 0
    }
}

你可能会好奇,为什么上面边界判断里用的 7 和 -8 这么奇怪的两个数。 因为 Integer.MAX_VALUE 是 2147483647,最后一位是 7;Integer.MIN_VALUE 是 -2147483648,最后一位是 -8。 当 res == 214748364 的时候,再乘以 10 变 2147483640,这时如果 digit > 7,比如 8、9,那就必炸。 同理负数那边再类比一下就行。

-END-

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