题目
难度简单
给你一个 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
提示:
-231 <= x <= 231 - 1
解法一
将整数转化成字符串,再反转,注意一下对应的负号的处理 和 反转后越界的抛出异常,即可。经过测试,使用StringBuffer比字符数组遍历一个一个字符反转快一些 但是整个算法来讲,还是很慢。
class Solution {
public static int reverse(int x) {
int res = 0;
String temp = String.valueOf(x);
StringBuffer sBuff = new StringBuffer(temp); //String转换为StringBuffer
// String s1 =sBuff.toString();
if (sBuff.charAt(0)=='-')
{
sBuff.deleteCharAt(0);
sBuff = sBuff.reverse();
try {
res=Integer.parseInt('-'+sBuff.toString());
} catch (NumberFormatException e) {
return 0;
}
}
else
{
sBuff = sBuff.reverse();
try {
res = Integer.parseInt(sBuff.toString());
} catch (NumberFormatException e) {
return 0;
}
}
// if(res>Math.pow(2,31)-1||res<-Math.pow(2,31)){
// return 0;
// }
return res;
}
}
Tips:
1.StringBuffer sBuff = new StringBuffer(temp); //String转换为StringBuffer
2.String temp = String.valueOf(x);//int转换成String
3.String s1 =sBuff.toString();//StringBuffer转化成String
4.res = Integer.parseInt(sBuff.toString());//String转化成int(最好用这个 而不用valueof).
5.Math.pow(2,31)// 2的31次方
解法二:
入栈出栈的思想 x取余是取最后一位数 作为ans的第一位, 然后ans每次都乘10 再加上x的余数,x每次都/10 判断溢出时候,因为溢出了之后就不能存储这个数,更不能比较大小,所以在乘10之前和最大值值/10 进行比较,如果比它大 那就溢出了,如果和他相同,再比较最后一位数。
有一个更加方便的方法
if(res*10/10!=res) {
// return 0;
// }
乘10 溢出了,但是不会报错,而是换成long形式存起来,用的时候再取为int型,所以读取的时候肯定不是真正的*10的结果。
public static int reverse(int x) {
int res = 0;
while(x!=0){
int pop = x%10;
// if(res*10/10!=res) {
// return 0;
// }
if(res>Integer.MAX_VALUE/10||(res==Integer.MAX_VALUE/10 && pop>Integer.MAX_VALUE%10)){
return 0;
}
if(res<Integer.MIN_VALUE/10||(res==Integer.MIN_VALUE/10 && pop<Integer.MIN_VALUE%10)){
return 0;
}
res=res*10+pop;
x=x/10;
}
return res;
}