【问题标题】:How to implement an efficient Python algorithm for finding matching digits?如何实现高效的 Python 算法来查找匹配数字?
【发布时间】:2021-05-01 11:27:21
【问题描述】:

假设我有 2 个相同数字 A 和 B(两个数字不同),我需要找到 X(A 和 B 中的位数,并且位置相同)和 Y( A 和 B 中的数字,但位置不同)。 例如,如果 A = 4567 且 B = 4567,则 X 为 4,Y 为 0。如果 A = 3456 且 B = 4567,则 X 为 0,Y 为 3。不考虑效率,我的代码如下如下:

def compare(num1, num2):
  x = 0
  y = 0
  for i in range(4):
     if str(num1)[i] in str(num2) and str(num1)[i] == str(num2)[i]:
        x += 1
     elif str(num1)[i] in str(num2):
        y += 1
  return ('X = %d, Y = %d'%(x,y))

但是,我认为这不是解决此问题的最有效方法。谁能提供更有效的解决方案?谢谢...

【问题讨论】:

  • 你的代码工作正常吗(除了你在这里没有正确格式化它,我假设它为你运行)?如果是这样,您担心效率是否有特殊原因促使您提出这个问题?您是否可以花时间解决其他/不同的问题?
  • 这是一个分配问题,它给出了更高的分数以提高效率......
  • 看起来像 compare("0110", "1111") != compare("1111", "0110")
  • 对于这个问题,数字只有不同的数字
  • 您知道如何衡量效率,以便决定哪种方法更好吗?效率只是速度,还是代码行数、可维护性、所需内存等其他指标?

标签: python algorithm for-loop memory-efficient


【解决方案1】:

我认为只有一种方法可以在保持整洁的同时缩短它。

for i in range(4):
    if str(num1)[i] == str(num2)[i]:
        x += 1
    elif str(num1)[i] in str(num2):
        y += 1

编辑在第 2 行,在 for 循环中。你写了if str(num1)[i] in str(num2) and str(num1)[i] == str(num2)[i]:str(num1)[i] in str(num2) 不需要,因为如果 num1[i] 等于 num2[i],则表示 num1[i] 已经在 num2 中,所以这行代码没用。

如果你只是想缩短线路,你可以试试这个:

for i in range(4):
        if str(num1)[i] == str(num2)[i]: x += 1
        elif str(num1)[i] in str(num2): y += 1

x = y = 0

【讨论】:

    【解决方案2】:

    使用dict 可以减少比较次数。

    str(num1)[i] in str(num2): 再次扫描整个字符串。你可以避免这种情况。

    def compare(num1, num2):
        x = 0
        y = 0
        result = {}
    
        num1 = str(num1)
        num2 = str(num2)
    
        for i in range(0,len(num1)):
            result[num1[i]] = i
    
        for i in range(0,len(num2)):
            if num2[i] in result:
                if result[num2[i]] == i:
                    x +=1;
                else:
                    y +=1;
    
        return ('X = %d, Y = %d'%(x,y))
    
    
    print(compare(4567,4567))
    print(compare(3456,4567))
    

    【讨论】:

    • 这比 OP 答案更长且效率更低。另外,如果 num2 比 num1 长怎么办
    • 对于这个问题,两个数字的位数相同
    • @ThePilotDude 为什么效率较低?
    • @JoverTay 你试过了吗?您对这种方法有任何顾虑吗?
    • 所以,你写的in查询再次扫描整个num2。这意味着对于 12345 和 98760,您必须进行 25 次比较,而不仅仅是 5 次比较。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2013-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    相关资源
    最近更新 更多