存在一个给定包含数字的数组的问题,该语句是查找由给定数组形成的子序列的最大长度,以使该子序列中的所有元素共享至少一个公共数字。 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
。有什么作用?
答案 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。迄今为止,最长序列的长度保存在其自己的变量中以供存储。
我认为您的实现忽略了一些细节:
ct
这样的缩写)。这样可以更轻松地调试自己的代码。c = set(int(digit) for digit in str(j))
答案 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}
的字典