一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第18天,点击查看活动详情。
题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x =-123 输出:-321
解题思路
- 先去判断x是否等于0.
- 判断是否超过范围,如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,直接返回0;否则执行代码。
- 真的要好好思考,好好锻炼。
注意:不能存储64位整数。将整数最大值和最小值num分为两部分 num/10 和 num%10,在数据组合之前判断是否越界。细节上,主要考虑如何将数字的每一位分离出来,循环求n%10可以将整数n的每一位分离出来,最开始得到的是n的个位数,也就是需要求解的最高位,在循环里面 * 10这样就可以得到所求的数字了
class Solution {
public int reverse(int x) {
int reverse = 0;
while(x != 0) {
if((reverse * 10) / 10 != reverse) {
reverse = 0;
break;
}
reverse = reverse * 10 + x % 10;
x /= 10;
}
return reverse;
}
}
使用工具类
-
先把int入参转化为绝对值
-
再转为字符串
-
字符串再转long
-
判断范围 是不是超过int 最大值
-
根据入参正负,返回对应的正负
注意:核心是如何避免数字越界,最简单的方法就是在他最接近越界的时候进行判断控制。初始给的就超过了最大值,这个我们可以直接进行判断,返回0就可以了,这个判断最简单(有一个数据就是这个,太恶心。),
class Solution {
public int reverse(int x) {
if (x == Integer.MIN_VALUE) return 0;
Long strReverse = Long.parseLong(strReverse(String.valueOf(Math.abs(x))));
if (strReverse > Integer.MAX_VALUE) return 0;
return (int) (x >= 0 ? strReverse : strReverse * (-1));
}
private static String strReverse(String str){
char[] chars = str.toCharArray();
int start = 0;
int end = chars.length-1;
while (start < end ){
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
return String.valueOf(chars);
}
}。