Contact me:

算法9 leetcode7. Reverse Integer 整数反转


这个题因为java的指数运算搞错了卡了很久。。无语。。
a^b是java的异或位运算,指数运算是Math.pow(a,b)
位异或:第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0

题目

-》链接《-

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
 
示例 1:

输入:x = 123
输出:321

示例 2:

输入:x = -123
输出:-321

示例 3:

输入:x = 120
输出:21

示例 4:

输入:x = 0
输出:0

提示:
-2^31 <= x <= 2^31 - 1

思路

1开始我想把整数转换成数组,然后从最后一位向前取,添加到新数组中,然后把新数组转换回来。
2但是换来换去太麻烦了,想到最后一位就是取10的余数,然后每次取完踢掉最后一位;最后把判断条件加上就行了
3利用对数来判断数字长度、÷10取整剃末位、末位在乘相应位数累加就可以得到翻转的数了(判断超出32位在累加过程中就可以判断)

代码

我的

class Solution {
    public int reverse(int x) {
        int k=0;
        int tm=x;
        int m=0;
        double log=Math.ceil(Math.log10(x));//几位数
        if(x<0){
            x=-x;
            log=Math.ceil(Math.log10(x));//几位数
            for(int i=1;i<=log;i++){
                m=x%(10);//取末位
                x=(int)Math.floor(x/10);//踢末位
                if (k>=2147483647) {//判断超出32位
                    k=0;
                    break;
                }
                else k+=m*Math.pow(10,((int)(log-i)));
            }

        }
        else{
            for(int i=1;i<=log;i++) {
                m=x%(10);//取末位
                x=(int)Math.floor(x/10);//踢末位
                if (k>=2147483647) {
                    k=0;
                    break;
                }
                else k+=m*Math.pow(10,((int)(log-i)));
            }
        }
        if(x==1) k=1;//对数特殊
        if (tm<0)         k=-k;//添加负号
        return k;
    }
}

热评的

链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/?discussion=ukHfZx

public int reverse(int x) {
        int res = 0;
        while (x != 0) {
            int t = x % 10;
            int newRes = res * 10 + t;
            //如果数字溢出,直接返回0
            if ((newRes - t) / 10 != res)
                return 0;
            res = newRes;
            x = x / 10;
        }
        return res;
    }


posted @ 2021-10-31 13:59  impwa  阅读(57)  评论(0编辑  收藏  举报