题目描述:(力扣题库7)
给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
-
示例 1:
输入:x = 123 输出:321
-
示例 2:
输入:x = -123 输出:-321
提示: -231 <= x <= 231 - 1
法一:
解题思路:
反转一个整数看起来简单,但实际操作中存在许多容易被忽略的细节。一不小心,代码就可能出现错误,或者仅在某些案例下有效。在解决这个问题时,关键在于正确提取整数的末位数字。除此之外,还需要考虑负数的情况,以及反转后可能出现的溢出问题。在编写代码时,务必考虑到这些方面,确保算法的准确性。
解题步骤:
-
1. 初始化一个变量
reversed
,用于存储逆序排列后的结果,初始值为0。使用while循环,条件为( X != 0 )
int reversed = 0;
while(x != 0){
int fresh = reversed * 10 + x % 10;
reversed = fresh;
x /= 10;
}
- 注意,循环条件不能为 ( x > 0 ), 否则,当传入的数字为负数时,while循环不会执行.
- 这样,我们就拿到了整数的末尾数字,并合成得到了一个新的整数,但这个新的整数可能超出了int类型能表示的范围,所以我们应当在循环中,做一些判断,当新的整数会溢出时,返回0
-
2. 检查是否发生整数溢出:
- 如果 (fresh - x % 10) / 10 != reversed,则说明发生了溢出,返回0。
- 如果新的整数 fresh 没有溢出, 那么 fresh 减去末尾数字 x % 10 就等于更新前的整数 reversed , 如果新的整数 fresh 溢出, 存储的数据会丢失, 此时 fresh , 不是我们所预期的结果.
- 以下是补充完整的while 循环的代码
-
int reversed = 0; while(x != 0){ int fresh = reversed * 10 + x % 10; if((fresh - x % 10) / 10 != reversed) return 0; reversed = fresh; x /= 10; }
-
-
3.最后:
-
如果没有return 0, 没有执行的话,说明反转后的整数没有溢出,直接返回该整数.
-
接下来是完整的代码
-
class Solution { public int reverse(int x){ int reversed = 0; while(x != 0){ int fresh = reversed * 10 + x % 10; if((fresh - x % 10) / 10 != reversed) return 0; reversed = fresh; x /= 10; } return reversed; } }
-
-
- 除此之外,我们还可能想到利用字符串一类,将整数反转,并进行输出.这种方法可以精准地得到整数反转后的结果,但是题目中要求---" 如果反转后整数超过 32 位的有符号整数的范围
[−231, 231 − 1]
,就返回 0。", 这时还需进一步判断,反转后的整数是否溢出了.
-
法二:
-
这个问题的解题思路可以总结如下:
1. 处理负数情况:首先,我们需要判断输入的整数是否为负数,以便在最后返回逆序排列后的整数时正确处理符号。
2. 逆序排列数字:我们可以使用取余运算和除法运算来逐位获取输入整数的数字,并将其逆序存储在一个字符串或StringBuilder中。
3. 处理溢出情况:在将逆序排列后的数字转换回整数时,可能会遇到整数溢出的情况。为了处理这种情况,我们可以尝试将字符串表示的逆序排列后的数字转换为整数,并在转换过程中捕获可能的数字格式异常。
4. 返回结果:最后,根据输入整数的符号情况,返回逆序排列后的整数或处理溢出时返回0。
通过这个思路,我们可以编写一个能够逆序排列整数并处理溢出情况的方法。
-
以下是具体的解题步骤:
-
boolean isNegative = x < 0;
这一行检查输入整数是否为负数,并将结果存储在isNegative
变量中。 -
x = Math.abs(x);
如果输入整数是负数,这一行将其转换为正数,以便后面处理。 -
StringBuilder reversedStr = new StringBuilder();
:创建一个StringBuilder
对象reversedStr
,用于存储逆序排列后的整数。 -
while(x != 0){
: 这是一个循环,用来逐位获取输入整数的数字并将其添加到reversedStr
中,直到x
变为0为止。 -
reversedStr.append(x % 10);
将x
的个位数字添加到reversedStr
中。 -
x /= 10;
将x
除以10,以便在下一次迭代中处理下一个数字。 -
try { ... } catch (NumberFormatException e) { ... }
: 这是一个异常处理块,用于捕获可能的数字格式异常,即当逆序排列后的整数超出整数范围时。 -
int reversed = Integer.parseInt(reversedStr.toString());
将reversedStr
中的逆序排列后的数字转换为整数。 -
return isNegative ? -reversed : reversed;
如果输入整数是负数,则返回逆序排列后的整数的负值;否则返回逆序排列后的整数。 -
return 0;
如果在转换整数时发生了数字格式异常,即整数溢出的情况,返回0作为溢出处理结果。-
class Solution { public static int reverse(int x) { boolean isNegative = x < 0; x = Math.abs(x); StringBuilder reversedStr = new StringBuilder(); while (x != 0) { reversedStr.append(x % 10); x /= 10; } try { int reversed = Integer.parseInt(reversedStr.toString()); return isNegative ? -reversed : reversed; } catch (NumberFormatException e) { return 0; } } }
-
-
-
以上就是本篇文章的全部内容,该偏博客文字讲述偏多,也掺杂了博主自己的一些想法与见解,内容如若有不妥之处,敬请谅解.