题目
7. Reverse Integer
Given a 32-bit signed integer, reverse digits of an integer.
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
分析
思路一:利用StringBuilder
特性
这是一个暴力解法,但有必要知道。Java中对StringBuilder
直接提供了一个reverse
(字符串翻转)方法,因而我们将输入的整形转为StringBuilder
类型并调用reverse进行翻转后,再转为整形返回即可。其间我们利用try-catch
来处理可能出现的溢出问题。
思路二:按位依次翻转
这是非常常规的解法。举一个具体的例子分析(假定输入是input,输出是output):
input = 123; output = 321;
分析如下:
input = 123 = 3 * 100 + 2 * 101 + 1 * 102
output = 3 * 102 + 2 * 101 + 1 * 100 = 321
先假设不考虑溢出:
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
//这里补充处理溢出问题的代码
rev = rev * 10 + pop;
}
return rev;
}
}
接下来补充处理溢出的部分:
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
这里是考虑到32位有符号整形的范围-2147483648——2147483647,因而需要考虑pop > 7
和pop < -8
题解
Java实现思路一
class Solution {
public int reverse(int x) {
boolean flag = x > 0;
String s;
if(flag)s = x + "";
else s = -x + "";
StringBuilder b = new StringBuilder(s);
s = b.reverse().toString();
int returnInt;
try{
returnInt = Integer.parseInt(s);
}catch (Exception e){
return 0;
}
return flag?returnInt:-returnInt;
}
}
Java实现思路二
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 / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
C++实现思路二
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
};
其中思路二也即LeetCode官方题解。