反转整数数字的 2 种不同方法 - 首选方法?

  • 本文关键字:方法 整数 数字 python
  • 更新时间 :
  • 英文 :


我正在研磨一些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,在字符串中,你可以以一定的精度操作它们。

*请记住,代码是为人类阅读而编写的。

最新更新