在减少“ n”之后,在给定列表中查找最小(最少)唯一数

时间:2019-07-19 18:14:06

标签: python arrays

问题陈述:在减少'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编码,但使用任何语言的解决方案将不胜感激。

3 个答案:

答案 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)