算法思路练习004-反转数字
题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)
思路
首先想到的还是暴力破解。
使用%取余,将数字每个位置上的数字从小到大依次拿出来。然后再分别与10及10的n次方相乘之后相加得到反转结果。
代码尝试—没有写出来判断是否会超过范围
@Test
void reverseNum() {
int x = 123;
int result = 0;
//对10取余,存入list
List<Integer> l = new ArrayList<Integer>();
// int[] temp = new int[32];
int j = 0;
while (x > 0) {
int i = x % 10;
l.add(i);
// temp[j] = i;
// j++;
x /= 10;
}
Iterator<Integer> iterator = l.iterator();
int len = l.size();
while (iterator.hasNext()) {
Integer next = iterator.next();
result = result * 10 + next;
}
System.out.println(result);
}
对比答案,能看到自己有多画蛇添足,另外,提前判断是否超int范围是重点
public int reverse(int x) {
//弹出尾数,推入新的数字尾部
int rev = 0;
while (x != 0) {
//弹出尾数
int num = x % 10;
// if(rev > (2^31)-1 )//不能直接比较,如果成立的话,说明rev已经大于32位int整数的最大值,就会int报错,而题目要求不能使用64位long型,所以需要改变判断方式
if (rev > 214748364 || (rev == 214748364 && num > 7)) {
return 0;
}
if (rev < -214748364 || (rev == -214748364 && num > 8)) {
return 0;
}
//将尾数推入rev的最低位
rev = rev * 10 + num;
x = x / 10;
}
return rev;
}
在数字超过232-1之前判断出来是否会大于Interger.MAX
if (rev > 214748364 || (rev == 214748364 && num > 7)) {
return 0;
}
if (rev < -214748364 || (rev == -214748364 && num > 8)) {
return 0;
}