题目描述
- 边界比较需要考虑,而且还有不允许64位整数的要求。
解法 & 代码
① 字符串解法
- 起初想到的做法,不过缺点比较多
- 首先用到了long,实际上不允许使用,修改的话做法参考②的溢出判断
- 估计比较慢,类型转换了很多次。
class Solution {public int reverse(int x) {if(x == Integer.MIN_VALUE){return 0;}int flag = 1;if(x < 0){flag = -1;x = -x;}StringBuilder sb = new StringBuilder(new Integer(x).toString());long ans = Long.parseLong(sb.reverse().toString()) * flag;if(ans>Integer.MAX_VALUE || ans<Integer.MIN_VALUE){ans = 0;}return (int)ans;}
}
② 类栈做法
- 看了题解,感觉应该是栈。
- 两个if:分别在不适用long的前提下进行了上下溢出的判断,-8 & 7对应极限值。
- 每次pop出最末尾的数字,然后push到新的“栈”上。
class Solution {public int reverse(int x) {int nowNum = 0;while (x != 0) {int pop = x % 10;x /= 10;if(nowNum > Integer.MAX_VALUE / 10 || (nowNum == Integer.MAX_VALUE / 10 && pop > 7)) {return 0;}if(nowNum < Integer.MIN_VALUE/10 ||(nowNum == Integer.MIN_VALUE && pop < -8)) {return 0;}nowNum = nowNum * 10 + pop;}return nowNum;}
}
- 时间复杂度O(log(x)),大概循环lg(x)次。
- 空间复杂度O(1)。