#7_整数反转
2019-03-28 本文已影响0人
FiveZM
via https://leetcode-cn.com/problems/reverse-integer/solution/
- 题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21
思路:
将int整数最后一位数逐一弹出来,再推入前一位数中,比如先定义一个rev,然后将整型x%10 弹出(pop)后得到的值,与rev乘以10再相加,即是将这个弹出来的值推入rev中
int 最大值为 2147483647
int 最小值为-2147483648
INTMAX : int 中的最大值
INTMIN : int 中的最小值
溢出就 return 0
伪代码逻辑:分为正数和负数
先讨论 rev 是正数的情况
temp = rev * 10 + pop 导致溢出,那么一定有 rev≥ INTMAX/10 。
情况1 rev > INTMAX/10 , 那么 temp = rev * 10 + pop 一定会溢出。
情况2 rev == INTMAX/10 , 那么只要 pop 大于 7 , temp = rev * 10 + pop 一定会溢出。超出int的范围
当rev为负数时,
temp = rev * 10 + pop 导致溢出, 那么一定有 rev≤INTMIN/10 .
情况1 rev < INTMIN/10 , 那么 temp = rev * 10 + pop 一定会溢出 . 少了10 的数,加一个个位的pop肯定 会溢出,低于int的范围
情况2 rev == INTMIN/10, 那么 pop 小于-8 ,temp = rev * 10 + pop 一定会溢出.低于int的范围
public class _007 {
public static void main(String[] args) {
System.out.println(myReverse(1534236469));
}
public static int myReverse(int x) {
int rev = 0;
int pop = 0;
while (x != 0) {
pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE && pop > 7))
return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE && pop < -8))
return 0;
rev = rev * 10 + pop;
}
return rev;
}
}