解题思路
起始思路很笨拙:思路一
- 把数值都变成正数处理,因为后续数据转换过程中如果存在负数符号会报错,但要用标志位标记一下负号再转换成正数
- 利用StringBuffer特有的倒序方法对数值进行倒序处理,倒序后要把开头的0全部删除,然后比较倒序后的数据是否超出了int的表示范围,超出了就返回0
- 然后就是把数值转换成int类型,然后通过标志位来判断是负数还是正数。
思路二:
我们只要能拿到这个整数的 末尾数字 就可以了:通过取模运算。
以12345为例,先拿到5,再拿到4,之后是3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。
代码
方法一
//运行时间:7ms 内存消耗37MB
class Solution {
public static int reverse(int x) {
long figure = x;
if(x==0) return 0;
boolean flag = false ;//正数
double min = Math.pow(2, 31);
double max = Math.pow(2, 31)-1;
if(figure<0) { //遇到负数,标记一下,如何全变成正数处理
flag =true; //负数
figure=-figure; //-2147483648*-1 = -2147483648 最小值乘-1比最大值大1,即最大值+1 = 最小值
}
String sb1 = String.valueOf(figure);
StringBuffer sb2 = new StringBuffer(sb1);
sb2.reverse();
for(int i=0;i<sb2.length();i++) {
if(sb2.charAt(0)=='0') {
sb2.deleteCharAt(0); //把开头连续的0全删掉
}else {
break; //当开头不为0了就退出
}
}
double curr_reverse_value = Double.parseDouble(sb2.toString());
//如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
if(flag==true && curr_reverse_value>min) return 0;
if(flag==false && curr_reverse_value>max) return 0;
if(flag==true) return -(int)curr_reverse_value; //负号前面加-
return (int)curr_reverse_value;
}
}
方法二:
//运行时间:1ms 内存消耗35.6MB
class Solution {
/*
* 优化后:
*/
public static int reverse(int x) {
long result = 0;
int tmp=0;
double int_min = -Math.pow(2, 31);
double int_max = Math.pow(2, 31)-1;
while(x!=0) {
tmp = x%10; //每次都取最后个数的数值
result = result*10+tmp;
x=x/10;
if(result<(int)int_min || result>(int)int_max) return 0;
}
return (int)result;
}
}