第7题:整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
V1版本
V1版本简单暴力,将整数反转到list中,在按位累加,不过效率是硬伤,代码如下
public int reverse(int x) {
// 1位数反转就是自己
if (x > -10 && x < 10) {
return x;
}
// 会浪费空间
List<Integer> list = new ArrayList<>(32);
while (x != 0) {
list.add(x % 10);
x /= 10;
}
// 用long类型来接收
long result = 0;
for (int i = list.size() - 1, j = 0; i >= 0; i--,j++) {
result += list.get(i) * Math.pow(10, j);
}
// 超过long类型的边界则返回0
if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
return 0;
}
return (int) result;
}
结果也是不出所料
image.png
V2版本
V1版本用list保存本身就很浪费空间,这个版本想办法将list去掉
其实也不需要用list保存,直接用结果集保存就行了
例:123
第一次获取到第一位 3
将 3加入result,result = 3
第二次获取第二位 2
将 3 * 10 + 2 = 32
第三次将32 * 10 + 1 = 321
反转结束,代码如下
public int reverse(int x) {
// 1位数反转就是自己
if (x > -10 && x < 10) {
return x;
}
// 用long类型来接收
long result = 0;
while (x != 0) {
result = result * 10 + (x % 10);
x /= 10;
}
// 超过long类型的边界则返回0
if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
return 0;
}
return (int) result;
}
image.png
V3版本
V3版本参考官文的 ##弹出和推入数字 & 溢出前进行检查##
返回还是用int接收,不过要提交判断是否溢出,代码如下
public int reverse(int x) {
// 1位数反转就是自己
if (x > -10 && x < 10) {
return x;
}
int result = 0;
int num;
while (x != 0) {
num = x % 10;
// 检查是否会越界
if (result > Integer.MAX_VALUE / 10 || (result == Integer.MAX_VALUE / 10 && num > 7)) {
return 0;
}
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && num < -8)) {
return 0;
}
result = result * 10 + num;
x /= 10;
}
return result;
}
image.png
执行结果也是1ms,不过在循环中加了两个if判断感觉和v2版本的总体评分应该也差不多
网友评论