1.背景
Leetcode专栏目的:希望给学习算法的朋友提供一些想法,也希望有大佬能够通过评论提供宝贵的意见。
Leetcode专栏方式:将展示实现代码的多种实现方式,并且对算法复杂度进行比较。由于笔者偏好,代码全部使用python实现。
本期题目: https://leetcode-cn.com/problems/reverse-integer/
2.解题方式
本次介绍循环、字符串反转两种解题方式
2.1 循环
本方法采用flag进行正负数标记,利用循环进行数值反转。
class Solution:
def reverse(self, x: int) -> int:
flag = (x > 0 and 2 or 1)
x = (flag == 1 and -x or x)
result = 0
while x:
result *= 10
result += x % 10
x //= 10
result = (-1)**flag*result
if result > 2147483647 or result < -2147483648:
return 0
return result
2.2 字符串反转
字符串反转方法是先用flag标记数值正负,然后统一用正数进行字符串反转,再利用flag进行正负还原。
class Solution:
def reverse(self, x: int) -> int:
flag = (x > 0 and 2 or 1)
x = (flag == 1 and str(-x)[::-1] or str(x)[::-1])
x = (flag == 1 and -1*int(x) or int(x))
if x > 2147483647 or x < -2147483648:
return 0
return x
3.总结
这个题目我在某大厂二面的过程中遇到过,题目很简单,在后期交流的过程中得知出彩点在于:
- 考虑到两种解题思路,实际上还可以有递归的方式,这不做解释,感兴趣可以自己实现。
- if-else语句使用很灵活。
因此在这总结一些简单易理解的if-else变化:
普通写法:这种写法在简单的if-else是表现得过于啰嗦
if a>b:
c = a
else:
c = b
表达式:真时放if前,这种可读性比较好
c = a if a>b else b
二维列表:利用大小判断的0,1当作索引。这种思路比较好,但是实践上效果一般
c= [b, a][a > b]
逻辑运算符:虽然简单,却发挥无限能量。
c = (a>b and a or b)