在列表中查找共享至少一位数字的元素的最大可能数目

时间:2019-07-16 17:37:24

标签: python subsequence

存在一个给定包含数字的数组的问题,该语句是查找由给定数组形成的子序列的最大长度,以使该子序列中的所有元素共享至少一个公共数字。 br />
现在有什么收获?好吧,我打算使用字典b将键存储为每个数字,并将值存储为到目前为止计数的点对点遍历给定数组。我认为字典值的最大数量,即更大的位数将是问题的答案,因为我们仍然存在一个小问题,即我们不应对出现在数组的ONE元素中的同一位数进行多次计数。为了克服这种故障,我使用了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。有什么作用?

3 个答案:

答案 0 :(得分:1)

您有好主意。但是,如果您使用Counter模块中的collections对象,则代码会更容易。它旨在完成您想做的事情:计算可重复项中某项的出现次数。

此代码使用生成器表达式查看列表alist中的每个值,使用内置的str()函数将该整数转换为数字字符串,然后使用{{1 }}内置函数将其转换为集合。如您所说,这将删除重复的数字,因为您只希望对每个项目计数一次。 set()对象然后查看这些数字并计数它们的出现。然后,代码使用Counter的{​​{1}}方法选择出现次数最多的数字(Counter参数仅返回列表中单个最受欢迎的数字,而most_common index将那个数字及其计数从列表中删除),然后再将该数字的计数(即(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)) 。请注意,如果输入为空或包含非整数,我的代码将给出错误。此版本的代码采用列表值的绝对值,以防止将负号(或负号)计算为数字。

答案 1 :(得分:0)

这是我自己的实现:

def solve(list_of_numbers):
    counts = {str(i):0 for i in range(10)}  # make a dict of placeholders 0 through 9
    longest_sequence = 0                    # store the length of the longest sequence so far
    for num in list_of_numbers:             # iterate through our list of numbers
        num_str = str(num)                  # convert number to a string (this makes "is digit present?" easier)
        for digit, ct in counts.items():    # evaluate whether each digit is present
            if digit in num_str:            # if the digit is present in this number...
                counts[digit] += 1          # ...then increment the running count of this digit
            else:                           # otherwise, we've broken the sequence...
                counts[digit] = 0           # ...so we reset the running count to 0.
            if ct > longest_sequence:       # check if we've found a new longest sequence...
                longest_sequence = ct       # ...and if so, replace the current longest sequence
    return longest_sequence[1]              # finally, return the digit that had the longest running sequence.

它使用dict存储每个数字连续出现的运行计数-对于每个数字,如果存在该数字,则计数递增;如果不存在,则重置为0。迄今为止,最长序列的长度保存在其自己的变量中以供存储。

我认为您的实现忽略了一些细节:

  1. 您的代码可能会返回出现次数最多而不是出现次数最多的 digit 。我不确定,因为您的代码对我来说很难解析,而您只给出了一个测试示例。
  2. 如果可以的话,请尽量避免使用单字母变量名称。请注意,由于我使用了全名,所以上面的代码更加清晰(最糟糕的是,“ {count”)使用ct这样的缩写)。这样可以更轻松地调试自己的代码。
  3. 我知道您在做什么以查找数字中存在的数字,但这比实际情况要冗长一些。我使用的一种更简单的解决方案是将数字简单地转换为字符串,并使用每个数字的字符而不是其值。在实现中,您可以执行以下操作:c = set(int(digit) for digit in str(j))
  4. 您的代码中似乎没有什么东西可以检测到何时不再存在数字,这可能会导致错误的结果。

答案 2 :(得分:0)

我在理解原始问题时遇到了麻烦,但是我认为您需要做的是将每个项目转换为字符串(如果它是整数),然后将每个数字分开。

digits = {}
    for item in thelist:
        digit[item] = []
        if len(item) > 1:
            for digit in str(item):
                digits[item].append(int(digit))

如果您的测试用例是12 11 3 4 5,那么这将产生{12 : [1,2], 11 : [1,1], etc}的字典