使用python进行数组操作Hackerrank

时间:2019-03-19 04:29:54

标签: python arrays

此逻辑适用于大多数测试用例,但不是全部。我在做什么错了?

def arrayManipulation(n, queries, m):
    li = []
    for j in range(0, m):
        p = queries[j][0]
        r = queries[j][1]
        v = queries[j][2]

        lo = []
        for i in range(0, n):
            lo.append(0)

        for i in range(p - 1, r):
            lo[i] = lo[i] + v

        li.append(lo)

    for i in range(1, m):
        for j in range(0, n):
            li[i][j] = li[i-1][j] + li[i][j]
    return max(max(li))

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')
    nm = input().split()
    n = int(nm[0])
    m = int(nm[1])

    queries = []
    for _ in range(m):
        queries.append(list(map(int, input().rstrip().split())))

    result = arrayManipulation(n, queries,m)
    print(result)
    fptr.write(str(result) + '\n')
    fptr.close()

4 个答案:

答案 0 :(得分:0)

由于没有必要,没有python样本将m传递给arrayManipulation -在python中,您可以遍历列表而不是列表的索引:

您正在使这种方式变得比所需的更加复杂,您无需保留先前的列表就可以更新一个列表,例如:

def arrayManipulation(n, queries):
    arr = [0]*n
    for a, b, k in queries:
        for i in range(a-1, b):
            arr[i] += k
    return max(arr)

答案 1 :(得分:0)

您使用了太多的for循环,可以很快将其减少到只有两个。

使用的方法可以是:

  1. 同时定义maximum_int_value = 0current_int_value = 0。首先将用于将整数最大值存储在完成的数组中,并使用current_int_value存储当前最大值。

  2. 第一个for的开头部分可以用诸如li = [0] * n + 1之类的东西代替。

  3. 仅使用两个循环-一个循环用于计算数组的第一步和最后一步,另一个循环用于获取最大的int值。

  4. 计算每一步或落入数组的总和。

  5. 如果maximum_int_value的值小于current_int_value,则maximum_int_value将为current_int_value。

全部

#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the arrayManipulation function below.
def arrayManipulation(n, queries):
    maximum_int_value = 0
    current_int_value  = 0
    li = [0] * n

    for query in queries:
        li[query[0] - 1] += query[2]
        # edge case taken from here - https://sites.northwestern.edu/acids/2018/11/12/solution-hackerrank-array-manipulation/
        if query[1] != len(li):
            li[query[1]] -= query[2]

    for i in range(len(li)):
        current_int_value  += li[i]
        if maximum_int_value < current_int_value :
            maximum_int_value = current_int_value 

    return maximum_int_value

if __name__ == '__main__':
    fptr = open(os.environ['OUTPUT_PATH'], 'w')

    nm = input().split()

    n = int(nm[0])

    m = int(nm[1])

    queries = []

    for _ in range(m):
        queries.append(list(map(int, input().rstrip().split())))

    result = arrayManipulation(n, queries)

    fptr.write(str(result) + '\n')

    fptr.close()

将通过HackerRank中的所有当前16个测试用例

It works

答案 2 :(得分:0)

def arrayManipulation(arr):
    check = []
    for i in range(len(arr)):
        check.append(arr[i][1])
    big_jug = max(check) + 1

    temps = []
    for i in range(len(arr)):
        temps = [[0] * big_jug for _ in range(len(arr))]

    for i in range(len(temps)):
        for j in range(arr[i][0], arr[i][1] + 1):     
            temps[i][j] = arr[i][2]
   
sums = list(map(sum, zip(*temps)))
print(max(sums))

首先,检查所有低端(即每个数组,数组的第二个值)以获得最大值,以创建一个嵌套数组,其中所有值均为零。 然后将所有零值替换为所有查询(主给定数组)中所述的上端和下端,并放置数组第三个值 总和所有嵌套列表 最后找到最终列表的最高值

答案 3 :(得分:0)

由于以下原因使用此方法

在此循环中,我们使用的是列表中的变量insted,这是由于列表比变量占用更多的空间。因此,请尝试使用变量

def arrayManipulation(n, queries):
arr = [0]*n
for i in queries:
    arr[i[0] - 1] += i[2]
    if i[1] != len(arr):
        arr[i[1]] -= i[2]
k = 0
p = 0
print(arr)
for q in arr:
    p += q
    if p > k:
        k = p
return k