leetcode-7 [Reverse Integer] 整数反转
Companies
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-231, 231 - 1], then return 0.
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
Example 1:
Input: x = 123
Output: 321
Example 2:
Input: x = -123
Output: -321
Example 3:
Input: x = 120
Output: 21
Example 4:
Input: x = 0
Output: 0
Constraints:
-231 <= x <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
应该很少有比这看起来更简单的题目了吧~~~
思路一:转为字符串处理 (这就是我。。。)
class Solution:
def reverse(self, x: int) -> int:
while abs(x)>0 and x % 10 ==0:
x //= 10
if x<0:
x = '-'+str(x)[::-1][:-1]
else:
x = str(x)[::-1]
x = int(x)
if x>pow(2,31) or x<pow(-2,31):
return 0
return x
一定要检查最后的限制条件! 时间复杂度O(n).
思路二:每次将最后一位pop出来,加到要返回的结果上去。
class Solution:
def reverse(self, x: int) -> int:
ans = 0
y = abs(x)
while y!=0:
pop = y%10
y = y//10
ans = ans*10 + pop
if ans>pow(2,31) or ans<pow(-2,31):
return 0
if x>=0:
return ans
else:
return -ans
时间复杂度O(logn),是快一点.
python3中的 “%” 和 “//”
为什么要说这个? 当然是因为上面的解法中,遇到了坑。。
思路二的第一版代码其实是这样的:
class Solution:
def reverse(self, x: int) -> int:
ans = 0
while x!=0:
pop = x%10
x = x//10
ans = ans*10 + pop
if ans>pow(2,31) or ans<pow(-2,31):
return 0
return ans
"**
%"取余、 "//"取整
多优美的解法~ ~~
这就超时了??? 经过仔细排查,我发现,事情并不简单:
没有一个与我想象中一致,这几年的python学到狗身上去了? 此刻我对公司有了真正的认同感!
1. //
仔细再想想是哪里出了问题,"//"真名叫取整除 (向下取整)
瞬间明了, 向下取整 -123/10=-12.3
向下取整是13,没错!-123//10=-13
2. %
“%” 真名叫取模(其实还是取余)
-123➗10=-12 ...-3
有问题吗? -12*10+(-3)=-123
完美符合商、余数的定义啊
而按照python中的算法: -123➗10=-13 ...7
倒是也对,可是为啥不按我的来???
为此 专门去复习了负数的除法,这两种算法都是对的,一个是正余数、一个是负余数。
然后去找了python 文档, 模运算符 “%” 的结果的正负总是与第二个操作数一致(或是为零);结果的绝对值一定小于第二个操作数的绝对值
以除数的正负作为标准!
那我们再试试:
还真是这样。。