今天在力扣上碰到了一道题 写一篇博客 顺便练习一下markdown的语法
原题:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
我的想法自然是转成char[]数组 反转数组再判断有没有越界
class Solution {
public static int reverse(int x) {
boolean positive = true;
char[] a = String.valueOf(x).toCharArray();
if ((int) a[0] == 45) {
positive = false;
a = Arrays.copyOfRange(a, 1, a.length);
}
System.out.println(Arrays.toString(a));
for (int i = 0; i < a.length / 2; i++) {
char b = a[i];
a[i] = a[a.length - 1 - i];
a[a.length - 1 - i] = b;
}
long c = Long.parseLong(new String(a));
if (positive) {
if (c > (1 << 31) - 1) {
return 0;
}
} else {
if (c > (1 << 31)) {
return 0;
}
return -(int) c;
}
return (int) c;
}
写的麻烦了一点,可是一运行 输入负数 答案却出错了 返回一个0,一检查发现(1<<31)是一个负数 int正整数最大取值是(1<<31)-1 int占4个字节 32位 最后一位是符号位 不注意经常会出错
可是要判断负整数有没有越界怎么办呢?
我把判断条件改成了c-1 > (1 << 31)-1
, 结果正确了
然而提交的时候 却提醒我编译错误 不能返回(int)c ide中却能正常运行 真是怪
我觉得是力扣的问题 用java经常出错
另一种思路:
这是我在评论区看的 很简洁 :
public static int reverse(int x) {
int res = 0;
int of = ((1 << 31) - 1) / 10;
while (x != 0) {
if (Math.abs(res) > ((1 << 31) - 1) / 10) return 0;
System.out.println(res*10+"\t"+x%10 +"\t");
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
每轮都取最高位的数字 再做判断是否越界
java中负数取值范围比正数大一 我认为判断绝对值有点问题?