我正在研磨一些LeetCode的东西,其中一个问题是反转整数的数字(例如123变成321(。
我想到了两种方法。第一个是纯粹的"数字",使用 10 的幂和模算术:
def reverse_digits1(num):
reversed_num = 0
while num > 0:
reversed_num *= 10
reversed_num += num % 10
num = num // 10
return reversed_num
第二种方法是使用内置的str()
和int()
方法。
def reverse_digits2(num):
num = str(num)
return int(num[::-1])
实质上是将其转换为字符串,反转它,然后将反转的字符串作为整数返回。
在这两者之间,哪种"更好"的方法?我猜这是第一个,它不涉及将数字变异为字符串,反之亦然,并且没有潜在的信息丢失?甚至会丢失信息吗?输入都是整数,所以不用担心浮点数,对吧?
一般来说,通过str()
和int()
来处理数字是一个好主意,还是应该坚持使用"数值方法"?
我添加了负数以防万一您可能需要它们,但如果没有它们,整体性能也不会发生巨大变化。
def reverse_digits1(num):
if num < 0:
neg = True
else:
neg = False
if neg:
num *= -1
reversed_num = 0
while num > 0:
reversed_num *= 10
reversed_num += num % 10
num = num // 10
if neg:
reversed_num *= -1
return reversed_num
def reverse_digits2(num):
num = str(num)[::-1]
if num.endswith('-'):
num = '-' + num[:-1]
return int(num)
from timeit import timeit as _t
timeit = lambda x: print(_t(x, globals=globals()))
timeit("reverse_digits1(123456789)")
timeit("reverse_digits1(-123456789)")
timeit("reverse_digits2(123456789)")
timeit("reverse_digits2(-123456789)")
这导致
5.207313711074936
6.272431325012982
2.453335871448827
3.285427497418125
因此,除了更具可读性*之外,它实际上也更快。
至于信息丢失,我无法想象使用您的常规整数是可能的, 即使它是浮点数或其他类型的数字,字符串也会更可靠,因为作为一个非常基本的例子,0.1+02 == 0.30000000000000001,在字符串中,你可以以一定的精度操作它们。
*请记住,代码是为人类阅读而编写的。