Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−2^31, 2^31 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
本题目的目的是翻转整数,此时我们需要考虑的就是翻转前后的数据是否会超出范围。
反转整数的方法可以与反转字符串进行类比。我们想重复“弹出” xxx 的最后一位数字,并将它“推入”到 rev\text{rev}rev 的后面。最后,rev\text{rev}rev 将与 xxx 相反。要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。
//pop operation:
pop = x % 10;
x /= 10;
//push operation:
temp = rev * 10 + pop;
rev = temp;
但是,这种方法很危险,因为当 temp = rev * 10 + pop时会导致溢出。
因此我们需要在这之前写一下检测语句。
int的范围-2147483648~2147483647
因此分为以下三种情况:
1.如果temp=rev*10+pop溢出了,那么一定有rev>=INTEGER/10
2.如果rev>Integer/10必定溢出
3.如果rev=integer/10,那么只要pop>7,也是必定溢出
根据上述条件我们编写如下的代码:
class Solution {
public int reverse(int x) {
int rev=0;
while(x!=0){
int 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;
}
}
网友评论