问题陈述:在减少'n'后,在给定列表中查找最小(最少)唯一数字
输入:
N and an Array(or list)
Where 0 < N < len(Array)
N是可能的减少数量,并且数组的输入需要用逗号(,)分隔
示例1:
N = 2
Array = 1, 2, 3, 3, 4, 4
输出: 在删除N个数组中的元素后,找到最小或最小的唯一元素
在上面的示例中, 从数组中删除N = 2个元素后
在上面的示例1中,应从数组中删除2 剩下三,三,四,四 因此,从数组中删除2个元素后,剩下2个唯一元素
因此,输出应为2
示例2:
N = 2 [ number of reductions possible]
Input Array : 1,3,4,1,2,4,2,2
Output: 3 [least number of unique elements]
说明:[1,1,2,2,4,4]将在删除[2,3]后成为结果数组
本应专门用Python编码,但使用任何语言的解决方案将不胜感激。
答案 0 :(得分:2)
由于您没有显示自己的任何代码,因此我仅给出一些算法的想法。如果您需要更多详细信息,请显示一些自己的代码。
Python标准库中Counter
模块中的collections
对象可以计算数组中每个数字的出现次数。使用Counter
对您的数组执行此操作。产生的Counter
对象的大小是数组中唯一项的数量。
然后使用Counter
的{{1}}方法将该信息从最流行的号码排序到最不流行的号码。现在从最不受欢迎的一端看一下结果。使用您的most_common
值“删除”数组中最不流行的值。您不需要实际执行删除操作,只需在概念上进行删除即可。完成删除操作(从概念上或实际上)后,N
对象的大小就是您的答案。
当然,有多种方法可以在没有Counter
的情况下执行此操作,但是代码会更冗长。再次,多花点功夫,然后我将很乐意提供更多细节。
答案 1 :(得分:1)
找到最小数量的唯一元素等同于找到最大数量的重复元素。
这里的驱动思想是利用您的减少量来去除出现次数最少的元素。为了做到这一点,您需要计算列表中每个元素的出现次数,按出现次数对它们进行排序,然后从最小到最大删除它们,直到删除用尽。唯一棘手的部分是第一部分,只有在您必须使用纯python对其进行编码时(@DerekLangley的答案提供了一个很好的示例,说明如何执行此操作)。
如果允许您导入标准库的其他部分,那么collections.Counter
可以快速解决此问题。这是一个示例实现,其中并未说明可能出错的任何内容(例如,空列表或N
大于len(lst)
的内容-面试官希望您提及并了解这些内容如何处理,请继续努力。)
import collections
...
def min_uniques(N, lst):
# use collections.Counter to get a sorted list of unique elements and their frequencies
most_common = collections.Counter(lst).most_common()
# returns [(most_frequent, num_occurrences), ...], so we pull from the back to get fewest occurrences.
# We could reverse the list and pull from the front but that would be less efficient
while N >= most_common[-1][1]:
# remove the element with lowest count and subtract its count from N, all at once
N -= most_common.pop()[1]
# return the number of unique elements left, after we can no longer remove enough to decrease that count
return len(most_common)
min_uniques(2, [1, 2, 3, 3, 4, 4])
# 2
min_uniques(2, [1, 3, 4, 1, 2, 4, 2, 2])
# 3
我在该代码上的注释代表我在编写时如何与面试官讨论这个问题。这是一个四行的python函数,但我很确定您也可以一分为二-面试官可能会询问如何改进此代码,以及是否可以举一个例子(也许说“认为它会使用X机制或Y机制,但我必须先阅读文档,然后进行一些修补。)
尽管我觉得“动态编程”还是有点流行,但我在这里没有特别了解“动态编程”的相关性。
答案 2 :(得分:0)
这是一种(可能)效率低下的方法。
ls = [1,3,4,1,2,4,2,2]
d = {}
for i in ls:
if i not in d:
d[i] = 1
else:
d[i] += 1
def min_num(n):
counter = n
while counter > 0:
del d[min(d, key = d.get)]
counter -= 1
return len(d.keys())
min_num(2)