一、情景描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2 ^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
二、思路
假设整数i>=0和i < 0两类
1) python中reverse怎么用的?是函数包吧。若要求不能用reverse怎么办?
2)s[::-1] 对于>=0的可以,(想错了,s得是字符串才能用)
(再次想:先把数字转字符串,用s[::-1],在转回数字;)
但是小于0的怎么办?保留符号??怎么做
三、实现
1)初步实现
class Solution:
def reverse(self,x):
if x >= 0:
return x[::-1]
else:
class Solution:
def reverse(self, x: int) -> int:
if x >= 0:
answer = str(x)
answer = answer[::-1]
answer = int(answer) # integer to string
else:
answer = abs(x)
answer = str(answer)
answer = answer[::-1]
answer = '-' + answer
answer = int(answer) # integer to string
if - 2**31 <= answer <= 2**31-1:
return answer
else:
return 0
leetcode 执行48ms,14MB通过。
2)参考改进
if - 2**31 <= answer <= 2**31-1:
return answer
else:
return 0
改为:
return answer if - 2**31 <= answer <= 2**31-1 else 0
48ms,13.8MB
思路2:
循环通过对10取模得到尾部数字,一步步乘10构造新的翻转后的整数即可。然而要注意首先判断原数字的正负,最后还要判断结果是否溢出。
e.g:
个位数:123%10 = 3
十位数:123 // 10 = 12(按照除法/算,在取整)
12 % 10 =2
百位数: 12//10 = 1
1%10 = 1
注意:
1、符号怎么处理
2、得到各个位上的数字
3、各个位上的数字和反转后的数字的关系
循环终止条件://10= 0 ,即去整除为0。
class Solution:
def reverse(self,x):
abs_x = abs(x)
while(abs_x):
abs_x%10 #???
abs_x = abs_x//10
参考:
class Solution:
def reverse(self, x):
flag = 1 if x >= 0 else -1 # 用flag记录整数正负
new_x = 0
abs_x = abs(x)
while abs_x:
new_x = new_x*10 + abs_x%10
abs_x //= 10 # 注意这里用的是取整除//而非/,不然就返回的是12.3(比如输入是123),正确返回结果应该是12
new_x = flag*new_x
return new_x if new_x < 2147483648 and new_x >= -2147483648 else 0
四、收获
1、python return只能用在函数中,不能用在if 语句(错误)
2、C++
1)程序结果一闪而过,怎么解决?
参考https://blog.youkuaiyun.com/bzhxuexi/article/details/16339045
在return 0;之前添加
cin.clear();
cin.sync();
cin.get();
return 0;
- / 除法:用于整数;返回商的整数部分
python里是 //
3、整数如何得到各个位置上的数字
五、总结
1、起初想法:先分类两类,负数怎么办??
2、思路2,不用字符串的方法务必掌握。
引用
https://blog.youkuaiyun.com/weixin_41011942/article/details/81146451