LeetCode高频算法面试题 - 007 - 整数反转
漫步coding 5/5/2022
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
题目难度: ★★, 中等
示例 1:
输入:x = 123
输出
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-2^31 <= x <= 2^31 - 1
# 代码实现
tips: 以下代码是使用Go代码实现的不同解法, 文章最后可以看C++、C、Java、Python实现
解题思路:
以12345为例,先拿到5,再拿到4,之后是3,2,1,我们按这样的顺序就可以反向拼接处一个数字了,也就能达到 反转 的效果。 怎么拿末尾数字呢?好办,用取模运算就可以了
1)、将12345 % 10 得到5,之后将12345 / 10
2)、将1234 % 10 得到4,再将1234 / 10
3)、将123 % 10 得到3,再将123 / 10
4)、将12 % 10 得到2,再将12 / 10
5)、将1 % 10 得到1,再将1 / 10
important, 这题整体还是很简单的, 只需要注意几个坑就行了, 一个是负数, 一个是可能会溢出, 比如原数字1147483649, 翻转后9463847411就会溢出(最大的32位整数2147483647)
func reverse(x int) ( num int) {
for x != 0 {
num = num*10 + x%10
x = x / 10
}
// 使用 math 包中定义好的最大最小值
if num > math.MaxInt32 || num < math.MinInt32 {
return 0
}
return
}
# 其他语言实现
1、Java
class Solution {
public int reverse(int x) {
int res = 0;
while(x!=0) {
//每次取末尾数字
int tmp = x%10;
//判断是否 大于 最大32位整数
if (res>214748364 || (res==214748364 && tmp>7)) {
return 0;
}
//判断是否 小于 最小32位整数
if (res<-214748364 || (res==-214748364 && tmp<-8)) {
return 0;
}
res = res*10 + tmp;
x /= 10;
}
return res;
}
}
2、Python3
class Solution:
def reverse(self, x: int) -> int:
if -10 < x < 10:
return x
str_x = str(x)
if str_x[0] != "-":
str_x = str_x[::-1]
x = int(str_x)
else:
str_x = str_x[:0:-1]
x = int(str_x)
x = -x
return x if -2147483648 < x < 2147483647 else 0
3、C
int reverse(int x){
int out=0;
while(x!=0){
if((out>214748364)||(out<-214748364)) return 0;
out=out*10+x%10;
x=x/10;
}
return out;
}
# 几种语言运行效果对比
也欢迎关注我的公众号: 漫步coding
。 一起交流, 在coding的世界里漫步。