我一年140万 女朋友一年15万 差了快10倍了 要不要换一个?感觉差距会越来越大 还没结婚 越看越不顺眼了 谈了才两年
刚看到个贴子:男的一年收入一百四十万,女朋友一年十五万,差了快十倍,他开始嫌弃对方,纠结要不要分手。网友回帖有的骂他现实,有的劝女生早走不送。
我觉得这事吧,关键不在赚多少,而在你到底把对象当“伴侣”还是“项目”。你要是真在乎这个人,收入差距是可以一起慢慢拉近的;可要是已经开始嫌弃、看不顺眼,那说明感情本身就经不起考验。今天嫌她赚得少,明天可能嫌她年龄、外貌、家庭背景,一样样都会变成理由。
换个角度想,一个肯支持你、理解你、愿意跟你一起过日子的伴侣,本身就是很大的价值。钱是会变的,人品和三观才是走得久的东西。
与其纠结要不要换女朋友,不如先想想:自己配不配让别人跟你一起扛未来。
面试题:整数反转
我跟你说个真事儿哈。前两天晚上快十一点,我在公司楼下等外卖,那会儿脑子已经有点迷糊了,手机上刷到一道老生常谈的算法题:整数反转。结果我们组那个小李在群里发了一句:”哥,你写个 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