欢迎来到我的小小世界

Change is a million times less painful than regret

0%

LC7.翻转整数

题目地址(7. 整数反转)

https://leetcode-cn.com/problems/reverse-integer/

题目描述

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

 

示例 1:

输入:x = 123
输出:321


示例 2:

输入:x = -123
输出:-321


示例 3:

输入:x = 120
输出:21


示例 4:

输入:x = 0
输出:0


 

提示:

-231 <= x <= 231 - 1

前置知识

公司

  • 字节跳动、百度

思路

题目解答主要有两种思路,一种是使用字符串的翻转,但是这样不符合题目原意;另一种则是进行数学计算,同时要注意的是,在进行数学计算的时候,由于题目要求不使用64位进行存储,所以使用long数据类型也是不合题意的,这里就要涉及到关于int类型边界的判断了。判断时需要注意的点有以下几点:

  • 判断时不能等全部都翻转完毕后再判断,因为在这过程中如果发生了溢出,程序是不会通过的,因此判断的位置要在取出下一位但还没有将取出的这一位添加到已有的数字上时进行判断,判断再加入此位(下一个数字)是否会发生溢出,如果溢出则直接返回0,否则继续添加(正负判断一致)。
  • 溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。
  • ans * 10 + pop > MAX_VALUE这个溢出条件来看
    当出现ans > MAX_VALUE / 10且 还有pop需要添加 时,则一定溢出
    当出现ans == MAX_VALUE / 10pop > 7 时,则一定溢出,7是2^31 - 1的个位数
  • ans * 10 + pop < MIN_VALUE这个溢出条件来看
    当出现ans < MIN_VALUE / 10且 还有pop需要添加 时,则一定溢出
    当出现ans == MIN_VALUE / 10pop < -8时,则一定溢出,8是-2^31的个位数

关键点

  • 边界值的判断

代码

  • 语言支持:Java

Java Code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

class Solution {
public int reverse(int x) {
int ans = 0;
while (x != 0) {
int pop = x % 10;
if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7))
return 0;
if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8))
return 0;
ans = ans * 10 + pop;
x /= 10;
}
return ans;
}
}

-------- 本文结束 感谢阅读 --------