给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
基础解法
本人首先想到的十分复杂的解法,通过将数字转换为字符串,逐个进行判断是否在最大和最小的区间内。执行流程如下:
1. 创建一个表示int类型最大值的字符数组
2. 创建一个表示int类型最小值的字符数组
3. 将输入的int类型数字转换为字符串类型并使用StringBuilder的reserve方法进行翻转。在翻转时对正数和负数做不同的处理;
4. 将反转后的字符串转换为字符数组用于遍历
5. 进行遍历,如果是正数与max进行比较,如果是负数与min进行比较,需要注意的是只有两个字符数组长度相同相同的时候才有比较的必要性,当不同的时候转换一定是安全的
- 在比较的时候,是从高位往低位比较的,如果某一位>max/min的某一位,说明超出了范围,直接返回0,若<max/min的对应为说明是安全的直接跳出循环即可
6. 最后将字符串转为int类型的数据
class Solution {
public int reverse(int x) {
String max = (int)(Math.pow(2, 31)-1) + "";
char[] charArrayMax = max.toCharArray();
String min = (int)Math.pow(-2,31)+"";
char[] charArrayMin = min.toCharArray();
String s = x+"";
if(s.startsWith("-")){
s = "-" + new StringBuilder(s.substring(1,s.length())).reverse().toString();
}else{
s = new StringBuilder(s).reverse().toString();
}
char[] charArray = s.toCharArray();
if(charArray[0] == '-' && charArray.length==charArrayMin.length){
for (int i = 1; i < charArray.length; i++) {
if(charArray[i] > charArrayMin[i])
return 0;
if(charArray[i] < charArrayMin[i])
break;
}
}else if(charArray.length==charArrayMax.length){
for (int i = 0; i < charArray.length; i++) {
if(charArray[i] > charArrayMax[i])
return 0;
if(charArray[i] < charArrayMax[i])
break;
}
}
return Integer.parseInt(s);
}
}
进阶解法
进阶解法参考如下文章
class Solution {
public int reverse(int x) {
int res = 0;
int temp = 0;
while(x != 0){
temp = x % 10; //把最后一位取出来
if(res > 214748364 || (res == 214748364 && temp>7)) //只需要在位数相等的时候进行比较即可
return 0;
if(res < -214748364 || (res == 214748364 && temp<-8))
return 0;
res = res*10 + temp; //逐步重组反转后的数字
x = x/10;
}
return res;
}
}