题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
思路
思路一
这题其实经常写Java程序的人一看,就能得到一个思路:将int
值转化为String
类型,然后倒叙一下转化为long
类型,再判断是否超过了int
类型的范围,于是就得到如下的代码实现:
public int reverse(int x) {
String temp=x+"";
if(x < 0) {
temp = temp.substring(1, temp.length());
}
String result="";
for (int i=temp.length()-1; i>=0; i--){
result+=temp.charAt(i);
}
long ll=Long.parseLong(result);
if(ll > Integer.MAX_VALUE || 0-ll <Integer.MIN_VALUE){
return 0;
}
if(x < 0){
return (int) (0-ll);
}
return (int)ll;
}123456789101112131415161718
思路二
思路一算法索然简单,但是涉及到了太多的转化,效率不高,所以提出另外一种方案,即重组数字,该思路是从个位开始重建数字:
数字s%10
的到个位数g,s=s/10
消除个位数
新数字n初始为0,n=n*10+g
,判断n是否超出int
型范围
代码如下:
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;
}