刚看到个贴子:有网友说自己月薪15k,跳槽面试直接开口要25k,临走还很淡定地说“回去考虑下”。结果第二天HR直接回:“35k可以给。”他却一下子慌了,开始打退堂鼓。

这事关键在于——你敢要高薪,就得先想好自己有没有配得上的实力和心态。很多人谈薪时特别勇,真到对方答应了,才发现自己怕的不是工作,而是被迫离开舒适区。高薪背后一定是更大的责任、更紧的节奏、更少的犯错空间,这很正常。
换个角度想,如果评估过工作内容、强度和风险,35k你也扛得住,那就别被“自我怀疑”吓退;如果确实感觉完全hold不住,那也别觉得丢人,说明你对自己还有点清醒认知。总的来说嘛,职场谈薪可以大胆,但别忘了,底气永远来自实力和持续的成长。
整数反转这个题啊,我是前几年面试的时候被问麻了,后来面试别人也老爱拿它说事儿。别看题目简单,里面坑还挺多的。
那天晚上十一点多,我在公司楼下便利店买泡面,手机一响,我们组那个小李发微信问我:“哥,LeetCode 那个反转整数到底怎么处理溢出的呀,我写的老过不了。”我当时一边等开水一边给他语音讲了一通,正好今天把那套思路写下来。
先把题目说人话一点:给你一个 32 位有符号整数 x,比如 123,要返回 321;给你 -123,就要返回 -321。如果反转之后的结果超过了 int 能表示的范围,就返回 0。Java 里 int 的范围是 -2147483648 到 2147483647。
很多同学第一反应就是:我转成字符串不就完了?其实能做,而且挺直观的。小李一开始就是这么干的:
publicintreverseByString(int x){boolean negative = x < 0;int t = Math.abs(x); String s = new StringBuilder(String.valueOf(t)).reverse().toString();try {int ans = Integer.parseInt(s);return negative ? -ans : ans; } catch (NumberFormatException e) {// 说明反转后超过 int 范围return0; }}思路就是:先把符号拿出来,绝对值变字符串,反转,再 parse 回 int。parse 失败说明爆了。这种写法在业务代码里其实也能用,简单粗暴,唯一的问题就是:有点“投机”,而且面试官一般想看你用纯数学的方式。
数学解法的核心就是两个字:“出栈”。你可以把 x 想象成一个栈,个位是栈顶,每次拿出一位,压到新数的后面去。
比如 x = 123:
对应到代码里就是不停做 x % 10 和 x / 10。关键问题在于:在 ans = ans * 10 + pop 这一步之前,我们要提前判断一下会不会溢出。
为啥要“提前”?因为溢出发生了 Java 也不会给你抛异常,它就悄悄绕一圈,你肉眼看不到问题,但是测试用例会告诉你——错。
那怎么判断呢?稍微耐心一点:
假设我们准备 ans * 10 + pop,如果 ans 已经大于 Integer.MAX_VALUE / 10,那你再乘 10 肯定就超了;如果 ans 正好等于 Integer.MAX_VALUE / 10,那就得看最后一位 pop 了,2147483647 的最后一位是 7,所以 pop 再大于 7 也会炸。同理对负数那一边也要做一遍。
直接上最终比较靠谱的写法吧,小李最后就是靠这段代码 AC 的:
publicintreverse(int x){int ans = 0;while (x != 0) {int pop = x % 10; // 取出最低位 x /= 10; // 去掉最低位// 正向溢出检查if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7)) {return0; }// 负向溢出检查if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8)) {return0; } ans = ans * 10 + pop; }return ans;}这里有几个细节,面试的时候顺嘴提一句,显得你是真的想明白了,而不是背答案的那种:
第一,为什么不用 long 来过渡? 很多人写成 long res,最后判断一下 res 有没有超出 int 范围,再 cast 回去。刷题平台一般也给过。但有些面试官会追问:“不用 long 怎么做?”上面这种预判溢出的写法,就是不用 long 的标准答案。
第二,负数要不要特殊处理? 你看我这个版本里根本没单独拆符号,直接让负数自己 % 和 /,Java 对负数取模、除法的行为是稳定的:-123 % 10 = -3,-123 / 10 = -12。只要溢出判断那两段写完整,正负都能搞定。
第三,前导零要不要管? 不用管。因为我们是数学运算,不是字符串拼接,像 120 这样的数,反转过程其实是:
自然就把前面的 0 吃掉了,所以返回 21 正好是题目想要的。
如果你想在本地随便跑两下,可以写个小 main:
publicstaticvoidmain(String[] args){int[] nums = {123, -123, 120, 1534236469};for (int n : nums) { System.out.println(n + " -> " + new Solution().reverse(n)); }}最后我那泡面吃完,小李那边发了个截图过来:Accepted,然后一句:“哥,这题我以后也拿来面别人。”我说行,你下次记得问的时候,多问一句“如果不能用 long 呢”,这样才算把这个小题玩明白了。
🔥东哥私藏精品🔥
东哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》。总量高达650GB。