给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
1.自己的解法:先将整数转换为字符串,然后定义两个指针分别指向头部和尾部,不断地交换两个指针指向字符的位置,然后将字符串重新转换为整数输出,利用try...catch来捕获异常,防止出现超出范围的情况。
注意:要考虑负数的情况。
class Solution {
public int reverse(int x) {
int num = x;
String numString = Integer.toString(Math.abs(num));//先将整数取绝对值,防止出现交换负号的情况
int left = 0;//指向字符串头部的指针
int right = numString.length() - 1;//指向字符串尾部的指针
char[] numsChar = numString.toCharArray();
char c = ' ';
while(left < right){
//交换字符位置
c = numsChar[left];
numsChar[left] = numsChar[right];
numsChar[right] = c;
left++;
right--;
}
numString = new String(numsChar);
if(x < 0){//如果是负数的情况,在字符串头部加一个负号
numString = "-" + numString;
}
//捕获异常
try{
return num = Integer.parseInt(numString);
}catch(Exception e){
return 0;
}
}
}
这种方法效率比较低。
2.注意:因为题目条件给了不能存储超过32位的数字,因此不能用long来存储整数。
评论的一个答案,利用long向int的向下转型是否出现了精度损失来判断是否超出了范围,很精彩,来自@弋
public int reverse(int x) {
long n = 0;
while(x != 0) {
n = n*10 + x%10;//因为最后除都会得到0,而且负号在取余时也会带上,因此就不需要单独考虑负号的情况了
x = x/10;//剩下的数字
}
return (int)n==n? (int)n:0;//利用强制类型转换来判断是否超出了32位的取值范围
}
题源:力扣