首页 > 解决方案 > 查找列表中至少共享一个相同数字的元素的最大可能数量

问题描述

给定包含数字的数组存在一个问题,该语句是找到从给定数组形成的子序列的最大长度,使得该子序列中的所有元素共享至少一个公共数字。

现在有什么问题?好吧,我打算使用字典b将键存储为每个数字,并将值存储为计数,同时逐位遍历给定数组。我认为字典值的最大数量,即更大的数字计数将是问题的答案,因为我们仍然有一个小故障,我们不应该多次计算出现在数组的一个元素中的相同数字。为了克服这个故障,我使用了 set c

为方便起见,此代码功能以及下面编写的驱动程序功能。

def solve (a):
    b={}
    answer=1

    for i in a:
        j=i
        c=set()
        c.clear()
        while(j):
            last_digit=i%10
            if(last_digit not in b and last_digit not in c):
                b[last_digit]=1
                c.add(last_digit)
            elif(last_digit in b and last_digit not in c):
                b[last_digit]+=1
                c.add(last_digit)
                answer=max(answer,b[last_digit])
            j//=10

    return answer


a=list(map(int,input().strip().split()))
print(solve(a))

有很多测试用例关注此代码是否正确。其中一个是输入12 11 3 4 5,代码给出的输出是1,预期输出是2。是什么赋予了?

标签: pythonsubsequence

解决方案


你有好主意。但是,如果您使用模块中的Counter对象,您的代码会更容易collections。它旨在做你想做的事情:计算一个项目在一个迭代中的出现次数。

此代码使用生成器表达式查看 list 中的每个值alist,使用内置str()函数将该整数转换为数字字符串,然后使用set()内置函数将其转换为集合。正如您所说,这会删除重复的数字,因为您只想对每个项目计算每个数字一次。然后该Counter对象查看这些数字并计算它们的出现次数。然后代码使用Counter'smost_common方法选择出现次数最多的数字(该(1)参数仅返回列表中最流行的单个数字,并且0索引将该数字及其计数从列表中取出)然后获取该数字的计数(那是1索引)。然后将该计数返回给调用者。

如果您不熟悉Counter或不熟悉生成器表达式,您可以自己计算并使用常规for循环。但是对于任何知道该Counter对象的人来说,这段代码都很简短而且相当清楚。如果您想要简短的代码,您可以使用注释中的行替换以下四行,但我扩展了代码以使其更清晰。

from collections import Counter


def solve(alist):
    digitscount = Counter(digit for val in alist for digit in set(str(abs(val))))
    # return digitscount.most_common(1)[0][1]
    most_common_list = digitscount.most_common(1)
    most_common_item = most_common_list[0]
    most_common_count = most_common_item[1]
    return most_common_count


alist = list(map(int, input().strip().split()))
print(solve(alist))

对于您的示例输入12 11 3 4 5,这将打印正确的答案2。请注意,如果输入为空或包含非整数,我的代码将出错。我的代码的这个版本采用列表值的绝对值,这可以防止减号(或负号)被计为数字。


推荐阅读