我正在尝试在Python中创建一个算法,该算法将从0到1,000,000的随机数列表中长度不超过100个元素,甚至可以尽可能地输出这个数组给出最大数量的相等元素。这就是我到目前为止所做的:
def answer(x):
diff = max(x) - min(x)
while diff > 1:
x[x.index(max(x))] = x[x.index(max(x))] - (diff / 2)
x[x.index(min(x))] = x[x.index(min(x))] + (diff / 2)
diff = max(x) - min(x)
return count(x)
def count(x):
from collections import Counter
c = Counter(x)
return max(c.values())
这将采用诸如[0,50]之类的数组并创建数组[25,25]并返回整数2,因为数组中有两个相等的元素。我知道这个算法在大多数情况下都有效,但它并不是全部。 任何人都可以指出任何整数数组,这不会产生正确的答案吗?感谢
对于那些不想阅读while循环的人来说,代码可以找到整个列表的范围。将范围分成两半并将最小值加一半,并从最大值减去一半。它试图在保持相同总和的同时平衡整个列表
[1,4,1] = [2,3,1] = [2,2,2] =(等元素数)3
[2,1,4,9] = [2,5,4,5] = [3,4,4,5] = [4,4,4,4] =(等元素数)全部{{1 }}
答案 0 :(得分:4)
这个怎么样?
l = [1, 2, 5, 10]
# "best" possible case
l_m = [sum(l) / len(l)] * len(l)
# see if lists fit (division can cause rounding errors)
if sum(l_m) != sum(l):
# if they don't this means we can only have len(l) - 1 similar items
print len(l) - 1
else:
# if sums fit the first list can be spread like this
print len(l)
答案 1 :(得分:1)
我可以想象你试图让数组中尽可能多的元素保持相同,同时保持它们的总和,并保持元素整数。
对于N
元素,您可以使N - 1
元素相等,并且运气好的话,所有N
元素相等。
这对你来说有点伪代码:
average = sum(elements) / length(elements) # a float
best_approximation = trunc(average) # round() would also work
discrepancy = sum(elements) - best_approximation * length(elements)
discrepant_value = best_approximation + discrepancy
result = [discrepant_value] + the rest of list having best_approximation value
通过构造,您获得相等值length(elements) - 1
和discrepant_value
一个{{1}}。
答案 2 :(得分:0)
在将输入规范化为整数平均值并在结果中分配余数时,您实际上在做什么。
L = [1,2,3,4,5,7]
# Calc the integer average
avg = sum(L)/len(L)
# Find the remainder
mod = sum(L)%len(L)
# Create a new list length of original
# populating it first with the average
L2 = [avg] * len(L)
# Then add 1 to each element for as many
# as the remainder
for n in range(mod): L2[n] += 1
def count(x):
from collections import Counter
c = Counter(x)
return max(c.values())
count(L2)
4
您无需变形原始列表或创建新列表(无需使用import
):
L = [1,2,3,4,5,7]
# Don't even need to figure the average if you
# find the remainder of the sum of your list
# divided by the length of your list
mod = sum(L)%len(L)
result = mod if mod >= len(L)/2 else len(L) - mod
print result
4
答案 3 :(得分:0)
在将整个数组的范围最小化到不大于1之后,它会检查数组中相等数字的数量是否与长度相同,这意味着数组看起来像这样:{{1}然后立即吐出相等数字(4)。如果列表中大多数相等数字的数量小于长度,则它使列表均衡。因此,如果列表类似[4,4,4,4]
,那么如果它可以转换为[4,4,3,3]
则更为理想。这就是均衡功能可以做的事情。
[4,4,4,2]