簡體   English   中英

如何找出 Python 中兩個數字之間的哪個數字不同?

[英]How can I find out which digit is different between two numbers in Python?

假設我們有兩個數字, 1873183 有沒有一種方法可以比 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 ,因為支持減法。

  1. 將數字轉換為字符串;
  2. 按長度排序;
  3. 用較長的減去較短的。

這里:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM