Leetcode: 反转32-bit整数

真的没意思的一道题,刚开始还想用stack做,后来只能感叹python的强大,直接反转字符串,核心代码就是[::-1]

class Solution:
    def reverse(self, x: int) -> int:
        if x > -10 and x < 10:
            return x
        sign = 1
        if x < 0:
            sign = -1
        reversestr = str(abs(x))[::-1]
        res = sign*int(reversestr.lstrip('0'))
        if res > 2**31 - 1 or res < -2**31:
            return 0
        return res

32ms,beat 98%

EDIT:刚开始觉得这道题出得不好,但其实只是python太强大以至于有点cheating的感觉,这道题的本质其实挺有用的:1. 考察类型转换,2. 如何用数学的方法获取一个数字的每一位数字。下面是两个Java基于数学的解:

  1. 这个解不是很优雅,先取绝对值(注意-2**31这个值是没法取到绝对值的,所以算一种特殊情况),然后获取每一位数字(并以个十百千万的顺序推进一个array),同时maintain一个stack,里面储存对应的divisor (位)。// 1326 -> [6, 2, 3, 1], div_arr= [1, 10, 100, 1000]。然后反转div_arr,对应相乘并相加就可以了
    3 ms, beat 41%.
class Solution1 {
        public int reverse(int x) {
            if (x < 10 && x > -10) return x;
            int sign = 1;
            if (x < 0) sign = -1;
            long y = Math.abs(x);
            ArrayList<Long> digit = new ArrayList<>();
            Stack<Long> div = new Stack<>();
            long divisor = 1;
            while (y != 0){
                long d = (y/divisor)%10;
                digit.add(d);
                div.push(divisor);
                y = y - d*divisor;
                divisor *= 10;
            }
            long res=0;
            for (int i = 0; i < digit.size(); i++){
                res = res + digit.get(i) * div.pop();
                // "res < 0" resolves the "Integer.MIN" case
                if (res > Integer.MAX_VALUE || res < 0) return 0;
            }
            int result = ((int) res);
            return sign*result;
        }
    }
  1. 一种更优雅的解:第一种解法没想到get digit和reverse这两步其实可以同时进行的,也就是说根本不用数组和stack,每当获取一个数字,将目前的反转数字乘以10然后加上这个数字就行了。// 1326 -> 010+6 = 6 -> 610+2 = 62 -> 6210+3=623 -> 62310+1 -> 6231
    1ms, beat 100%.
class Solution2 {
        public int reverse(int x){
            long res = 0;
            while (x != 0) {
                res = res * 10 + x % 10;
                if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) return 0;
                x /= 10;
            }
            return ((int)res);
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值