计算一个数组中的元素数少于另一个数组中的元素数

时间:2018-10-14 11:41:39

标签: python arrays sorting

我不确定这是否是提出这个问题的合适地点,但我一直在努力寻找正确的答案。我已经进行了编程测试,但是我无法弄清楚为什么在某些测试案例中我的代码会失败。

问题在于给定一个未排序的元素数组,例如[1、4、2、4]和一个最大值数组,例如[3,5],给出了第一个数组中元素数量的解小于第二个数组中的最大值。即[2,4]

一些例子是

输入

nums = [2, 10, 5, 4, 8]
maxes = [3, 1, 7, 8]

输出

solution = [1, 0, 3, 4]

输入

nums = [1, 4, 2, 4]
maxes = [3, 5]

输出

solution = [2, 4]

因为存在一个元素是小于或等于3,并且有0个元素小于或等于1和3个元素小于或等于3和4个元素小于或等于8

4 个答案:

答案 0 :(得分:1)

伪代码:

Sort number array
Sort maximum array
create a list counts
for max elem in max array
      find first elem in number array that is greater than or 
      equal to max elem and save its (index+1) in counts

因此,现在计数将是与已排序数字数组平行的数组。在计数的索引0处,元素的数量小于max数组的索引0处的元素的数量。

如果您需要字典形式的数据(如您在解决方案中一样)而不是两个平行列表,则可以执行以下操作。

Set index to 0
for max elem in max array:
    dictionary[max elem] = counts[index]
    index += 1

请注意,您可以在上面使用枚举,但是我不确定您是否知道这一点,因此我尝试给出最简单的解决方案。

答案 1 :(得分:0)

这是您需要做的事情的简化版本

nums = [1, 4, 2, 4]
maxes = [3,5]

result = [0]*len(maxes)
for index, max_val in enumerate(maxes):
    for num in nums:
        if num <= max_val:
            result[index] += 1

print(result)

答案 2 :(得分:0)

我只是将其写为

[sum(1 for x in nums if x < m) for m in maxes]

演示:

>>> nums = [2, 10, 5, 4, 8]
>>> maxes = [3, 1, 7, 8]
>>> 
>>> [sum(1 for x in nums if x < m) for m in maxes]
[1, 0, 3, 3]
>>>    
>>> nums = [1, 4, 2, 4]
>>> maxes = [3, 5]
>>> 
>>> [sum(1 for x in nums if x < m) for m in maxes]
[2, 4]

它可读性强,内存效率高,使用C语言实现的快速理解,您将不得不努力寻找一个可以证明进一步进行微优化的示例。

答案 3 :(得分:0)

def find_total_matches(team_a, team_b):
    if not team_b:
        return []
    if not team_a:
        return [0]*len(team_b)
    team_a.sort()
    team_b_sorted = sorted(team_b)
    a_i = 0
    b_i = 0
    c_sum = 0
    cnt = dict()
    while a_i <len(team_a) and b_i < len(team_b_sorted):
        val= team_b_sorted [b_i]
        if val not in cnt:
            while a_i < len(team_a) and val >= team_a[a_i]:
                c_sum += 1
                a_i += 1
            cnt[val] = c_sum
        b_i += 1
    result = []
    for val in team_b:
        result.append(cnt[val])

    return result