这是我参与11月更文挑战的第8天,活动详情查看:2021最后一次更文挑战
1.leetcode #### 整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入: x = 123
输出: 321
示例 2:
输入: x = -123
输出: -321
示例 3:
输入: x = 0
输出: 0
解题:
方法1,不考虑性能什么的话,可以直接将数字转成字符串,然后直接将字符串反转,最后再将字符串转为int数字,记得加上符号。
public int reverse111(int x) {
// 转成字符串然后在反转字符串
StringBuilder sb = new StringBuilder("" + Math.abs(x));
sb.reverse();
// 然后再把字符串转为数字,负数记得加上符号
int res = 0;
try {
res = x < 0 ? Integer.parseInt(sb.toString()) * -1 : Integer.parseInt(sb.toString());
} catch (NumberFormatException ignored) {
}
return res;
}
还有种方式每次获取到x最后的一位数,然后依次拼接在结果数字上,例如4321,取最后一位数就是1,取了1就把1截掉,然后就是2,3,4,每次取了最后一位数,先把结果*10然后在加上这个数,这样就能达到拼接的效果,最后得到的就是1234就是反转的结果了。而取最后一位数可以通过对x进行取模运算获得。如果x为负数的话,那么取模的结果也是负数,最后拼接相加得到的结果也会是负数。因为x的范围为[-2^32,2^32-1]内,反转后的字符串会有可能超过了这个范围,所以需要判断一下,如果反转后的字符串超过这个范围就直接返回0。
class Solution {
public int reverse(int x) {
// 返回值
long res = 0L;
// 循环每次取掉x的最后一位数,直到取完为0,正负数取完最后都会为0
while (x != 0) {
// 把x的最后一位取来 放到返回值的后面
// res*10 往后面加一位,x%10 取模再加上x取出的最后一位数
res = res * 10 + x % 10;
// 截掉x的最后一位数
x /= 10;
}
// 如果超过int的范围 直接返回0
if (res < Integer.MIN_VALUE || Integer.MAX_VALUE < res) {
return 0;
}
return (int) res;
}
}