官方链接:https://leetcode-cn.com/problemset/all/
一、题意
难度:简单
https://leetcode-cn.com/problems/reverse-integer/
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
示例
输入:x = 123
输出:321
输入:x = -123
输出:-321
输入:x = 120
输出:21
输入:x = 0
输出:0
提示:
- 231 <= x <= 231 - 1
二、解题
方法一:字符串转换
思路:
字符串转换获取是最容易想到的一个方法,先将该数值转换成字符串,再进行翻转即可。不过这里还需要考虑一步溢出的问题,所以需要捕获一下异常,使其直接返回 0。
代码:
class Solution {
public int reverse(int x) {
// 正负标记
int flag;
// 字符串
StringBuilder sb = new StringBuilder();
String s = "" + x;
// 判断是否为负数
if(x >= 0){
flag = 1;
sb.append(s);
}else{
// 截取 - 号后面的数值
flag = -1;
sb.append(s.substring(1));
}
// 翻转字符串
sb.reverse();
try{
// 返回结果
return flag * Integer.parseInt(sb.toString());
}catch(Exception e){
// 超过 Integer 上下限,直接返回 0
return 0;
}
}
}
复杂度分析:
- 时间复杂度:O(log(x))
- 空间复杂度:O(log(x))
方法二:数学
思路:
通过循环将数字 x 的每一位拆开,从后往前进行累加,同时判断下一步是否溢出
溢出条件:
MAX_VALUE
当前值 > Integer.MAX_VALUE / 10,且 x 不为零时则一定为溢出数值
当前在 == Integer.MAX_VALUE / 10,且 x 大于 7 (Integer.MAX_VALUE 个位数为 7)时则一定溢出
MIN_VALUE
当前值 < Integer.MIN_VALUE/ 10,且 x 不为零时则一定为溢出数值
当前在 == Integer.MIN_VALUE / 10,且 x 小于 -8 (Integer.MIN_VALUE个位数为 8)时则一定溢出
代码:
class Solution {
public int reverse(int x) {
int res = 0;
while(x != 0) {
int temp = x % 10;
if(res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE / 10 && temp > 7) ||
res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE / 10 && temp < -8)){
return 0;
}
res = res * 10 + temp;
x /= 10;
}
return res;
}
}
复杂度分析:
- 时间复杂度:O(log(x))
- 空间复杂度:O(1)