给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果
https://leetcode-cn.com/problems/reverse-integer/
给你一个 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
Java解法
思路:
将x循环与10 相除与取余;除值作为下次循环的值( 为0跳出),余数作为反转数的头部进行循环乘10 相加
犯二思路:没考虑异常(int数组越界 -2147483648~2147483647)注意异常处理,解决参考官方解
循环相加时 提前判断会不会导致越界
- 判断余数是不是大于最大值/10(或小于最小值/10)
- 等于时判断加新余数是不是大于最大值/10(或小于最小值/10),新余数的值不能大于最大值的个位数(或小于最小值的个位数)
package sj.shimmer.algorithm;
/**
* Created by SJ on 2021/1/29.
* 整数反转
*/
class D5 {
public static void main(String[] args) {
System.out.println(Integer.MAX_VALUE);
System.out.println(Integer.MIN_VALUE);
System.out.println(reverse(1534236469));
System.out.println(reverse(123));
System.out.println(reverse(-123));
System.out.println(reverse(120));
System.out.println(reverse(0));
}
public static int reverse(int x) {
int rev =0;
while (x != 0) {
int top = x%10;
x = x/10;
if (rev>Integer.MAX_VALUE/10
||(rev==Integer.MAX_VALUE/10&&top>7 )) {
return 0;
}
if (rev<Integer.MIN_VALUE/10
||(rev==Integer.MIN_VALUE/10&&top<-8 )) {
return 0;
}
rev = rev*10+top;
}
return rev;
}
}
官方解
弹出和推入数字 & 溢出前进行检查
思路如上
其他(失去解题的意义)
- String转换,捕捉异常
- long型计算,边界判断