我不确定这是否是提出这个问题的合适地点,但我一直在努力寻找正确的答案。我已经进行了编程测试,但是我无法弄清楚为什么在某些测试案例中我的代码会失败。
问题在于给定一个未排序的元素数组,例如[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
答案 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