您的位置:首页 > 其它

Leetcode: 反转32-bit整数

2019-05-21 11:05 281 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/guyuan002/article/details/90402907

真的没意思的一道题,刚开始还想用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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: