python中一个大列表的总和

时间:2019-07-05 17:36:25

标签: python python-3.x algorithm optimization

从给定的大型列表计算整数的索引,该大型列表的删除不会影响列表的平均值

我尝试了线性时间方法,但是它似乎无法通过数字大于10 ^ 9且列表大小超过10 ^ 5的测试用例。 请提出一些更好的方法来解决此问题(如果有的话),或者提出一种更有效的方法来汇总具有大值的大型列表。 这是我的代码如下:

for _ in range(int(input())):
    n=int(input())
    #ar=list(map(int,input().split()))
    ar=[int(x) for x in input().split()]
    me=sum(ar)/n
    for j in range(n):
        #arr2=deepcopy(ar)
        arr2=ar[:]
        #arr2=[]
        #for _ in ar:
         #   arr2.append(_)
        arr2.remove(ar[j])
        if (sum(arr2)/(n-1))==me:
            print(j+1)
            break
    else:
        print("Impossible")

在10个测试案例中,有两个代码失败,只是因为列表的len和整数大小的增加

2 个答案:

答案 0 :(得分:2)

您似乎在每次迭代中都会对整个数组进行深层复制,这很昂贵。为什么不检查项目是否等于均值?

for _ in range(int(input())):
    n = int(input())
    ar = [int(x) for x in input().split()]
    mean = sum(ar) / n
    found = False

    for j in range(n):
        if ar[j] == mean:
            print(j, " is the result.")
            found = True
            break

    if not found:
        print("Impossible")

答案 1 :(得分:0)

这看起来更像是数学问题,而不是算法挑战:

假设mean = sum(list)/len(list),我们需要一个值k使得:

mean = (sum(list)-k)/(len(list)-1)

一些代数告诉我们的是:

k = sum(list) - mean * (len(list)-1)

k = sum(list) - mean * len(list) + mean

k = sum(list) - sum(list) + mean     <-- because mean*len(list) = sum(list)

k = mean

例如:

a  = [1,2,3,4,5,6,7]
k  = sum(a)/len(a) # 4
ik = a.index(k)    # 3