![](/img/trans.png)
[英]How to find tens/ones digit of two different numbers regardless of their length
[英]How can I find out which digit is different between two numbers in Python?
假設我們有兩個數字, 1873
和183
。 有沒有一種方法可以比 python 中的 O(n) 更快地找到這兩個數字之間的不同數字?
我能想到的只是以下解決方案:
def difference_1(num1, num2):
for digit in str(num1):
if digit not in str(num2):
return digit
由於類型轉換和 O(n^2) 復雜性,這對我來說看起來非常次優。 我想不出任何其他方式,因為我需要檢查每個數字,所以我需要一個可迭代的 object 因此str
類型轉換。
有沒有其他方法可以以更好的性能和更慣用的方式實現相同的結果?
在我的問題中發現了一些模棱兩可的地方。
這是最重要的約束:
Num2 始終是 Num1 的變體,但缺少一個數字。
我試圖找到丟失的數字。
一些測試用例:
Num1,Num2,結果
1234、123、4
1223, 123, 2
987、87、9
嘗試:
from itertools import zip_longest
def difference_1(num1, num2):
return next(d1 for d1, d2 in zip_longest(str(num1), str(num2)) if d1 != d2)
這在最壞的情況下具有線性復雜性(即,最后一位數字是丟失的數字)。
>>> difference_1(1873, 187)
'3'
>>> difference_1(1234, 123)
'4'
>>> difference_1(1223, 123)
'2'
>>> difference_1(987, 87)
'9'
如果您不想使用zip
,也可以使用zip_longest
:
def difference_1(num1, num2):
return next((d1 for d1, d2 in zip(str(num1), str(num2)) if d1 != d2), str(num1)[-1])
比較數字?
def f(n1, n2):
while n1 and n2:
d1, d2 = n1 % 10, n2 % 10
if d1 != d2:
return d1
n1, n2 = n1 // 10, n2 // 10
if not n2:
return n1
ns = [
(1873, 187), # 3
(1234, 123), # 4
(1223, 123), # 2
(987, 87) # 9
]
for n1, n2 in ns:
print(f(n1, n2))
您可以使用Counter
,因為支持減法。
這里:
from collections import Counter
def missing_int(x,y):
shorter,longer=sorted(map(str, [x,y]),key=len)
return list((Counter(longer)-Counter(shorter)).keys())[0]
你可以測試:
cases=[
(1234, 123, 4),
(1223, 123, 2),
(987, 87, 9)
]
for x,y,ans in cases:
print(missing(x,y))
印刷:
4
2
9
由於使用了按len
sorted
,因此無論哪個是較長的數字都有效。
如果第一個數字總是較長,您可以稍微簡化一下:
def missing_int(x,y):
longer,shorter=map(str, [x,y])
return list((Counter(longer)-Counter(shorter)).keys())[0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.