字节跳动高频面试题-7.整数反转

解法都在代码里,不懂就留言或者私信

这个题排在字节跳动半年榜的第64题,但是题目确实远非如此,我知道的最近一个月至少考过4次,还是必须掌握的

class Solution {
    public int reverse(int x) {
        /**一位的整数,不管是整数还是负数,没有什么可反转的,反转了和自己也一样 */
        if(x >= -9 && x <= 9) {
            return x;
        }
        /**负数的承载范围比较大,统一转换为负数处理,转换之前记录一下是否为正数
        如果是正数,最后的结果取相反数 */
        boolean isPositive = x > 0;
        x = isPositive? -x : x;
        /**基本思路是按照每次取余然后乘在高位,然后往高位一位一位取余重复操作
        这个过程中一定要注意是否超过了int的范围,比如Integer.MAX_VALUE和MIN_VAVLUE相反之后都会超出
        超出直接返回0*/
        /**当前数到了多少*/
        int curNum = 0;
        /**记录两个值minLastDigitNum和minDivide10分别表示Integer.MIN_VALUE%10和Integer.MIN_VALUE/10
        之后的值,这个值用于反转过程中的越界判断 */
        int minLastDigitNum = Integer.MIN_VALUE % 10;
        int minDivide10 = Integer.MIN_VALUE /10;
        while(x != 0) {
            /**要计算的下一位 */
            int curDigitNum = x %10;
            /**任何一种发生都说明要越界了,越界就返回0 */
            if(curNum < minDivide10 || (curNum == minDivide10 && curDigitNum < minLastDigitNum)) {
                return 0;
            }
            /**使用之前的结果*10+当前位 */
            curNum = curNum * 10 + curDigitNum;
            x = x / 10;
        }
        /**最后根据正负数确认最终结果,正数的注意处理越界 */
        return isPositive? (curNum == Integer.MIN_VALUE? 0 : -curNum) : curNum;
    }
}

这种题估计写出来的都是最优解吧,哈哈

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值