zltzlt 发表于 2020-1-22 13:43:57

Python:每日一题 312

本帖最后由 zltzlt 于 2020-1-22 14:17 编辑

今天的题目:

给定一个数组,返回数组中的所有子数组之和。

说明:如果数组为 ,则该数组所有的子集是 [, , , , , ]。

示例 1:

输入:
输出:20
解释:(1) + (2) + (3) + (2 + 3) + (1 + 2) + (1 + 2 + 3) = 20

示例 2:

输入:
输出:6
解释:(1) + (2) + (1 + 2) = 6

{:10_298:}欢迎大家一起答题!{:10_298:}

TJBEST 发表于 2020-1-22 14:09:55

本帖最后由 TJBEST 于 2020-1-22 14:15 编辑

哇,楼主真的太勤奋了@zltzlt这个重复元素怎么处理?比如这个您能给示范吗?

阴阳神万物主 发表于 2020-1-22 14:13:34

迷惑行为。
-> [,,,,,,]
-> [,,,,,,]

zltzlt 发表于 2020-1-22 14:18:26

阴阳神万物主 发表于 2020-1-22 14:13
迷惑行为。
-> [,,,,,,]
-> [,,,,

子数组必须是连续的

TJBEST 发表于 2020-1-22 14:19:04

阴阳神万物主 发表于 2020-1-22 14:13
迷惑行为。
-> [,,,,,,]
-> [,,,,

这样的数组 是不是存在两个啊?还是算一个

阴阳神万物主 发表于 2020-1-22 14:25:27

zltzlt 发表于 2020-1-22 14:18
子数组必须是连续的

zltzlt 发表于 2020-1-22 14:25:47

TJBEST 发表于 2020-1-22 14:09
哇,楼主真的太勤奋了@zltzlt这个重复元素怎么处理?比如这个您能给示范吗?

和普通数组一样

--> [, , , , , , , , , ...]

zltzlt 发表于 2020-1-22 14:26:25

TJBEST 发表于 2020-1-22 14:19
这样的数组 是不是存在两个啊?还是算一个

两个

阴阳神万物主 发表于 2020-1-22 14:36:11

本帖最后由 阴阳神万物主 于 2020-1-22 14:39 编辑

要去重另说,但应该不用去重。
def solve(lst):
    times = len(lst)
    res = lst*times if times else 0
    try:
      lst.pop(0)
      res += lst[-1]*times
      lst.pop(-1)
    except:
      return res
    times += len(lst)
    for each in lst:
      res += each * times
    return res
if __name__ == '__main__':
    print('示例1 输出:',solve())
    print('示例2 输出:',solve())

zltzlt 发表于 2020-1-22 14:40:33

阴阳神万物主 发表于 2020-1-22 14:36
要去重另说,但应该不用去重。

解答错误

输入:
输出:147
预期结果:155

Croper 发表于 2020-1-22 14:44:46

def func312(l:list):
        left,right=1,len(l)
        ret=0
        for i in l:
                ret+=i*left*right
                left+=1
                right-=1
        return ret

Croper 发表于 2020-1-22 14:51:39

本帖最后由 Croper 于 2020-1-22 14:52 编辑

写成一行的版本def func312(l:list):
        return sum((i+1)*(len(l)-i)*l for i in range(len(l)))

Croper 发表于 2020-1-22 15:00:55

看起来测试用例有点长。。。

kinkon 发表于 2020-1-22 15:02:09

Croper 发表于 2020-1-22 14:51
写成一行的版本

只是佩服Croper老大的头脑

塔利班 发表于 2020-1-22 15:30:07

def f312(x):
    s=sum(x)
    n=len(x)
    r=n*(n+1)//2*s
    coef=[(n-i)*(n-i-1)//2 for i in range(n)]
    for e in zip(x,coef,coef[::-1]):
      a,b,c=e
      r-=a*(b+c)
    return r

kinkon 发表于 2020-1-22 16:07:31

塔利班 发表于 2020-1-22 15:30


佩服...

塔利班 发表于 2020-1-22 16:16:42

kinkon 发表于 2020-1-22 16:07
佩服...

没有,看了大神的感觉走了点弯路,,

TJBEST 发表于 2020-1-22 16:47:31

我的代码总是很长,需要改进{:5_109:}
def fun312(arr):
    def inner(n):
      down_gate = n - 1
      up_gate = N - n
      res = 0
      if down_gate <= up_gate:
            for i in range(0,down_gate):
                res = res + (i + 1)*arr
            for i in range(down_gate,up_gate + 1):
                res = res + n * arr
            for i in range(up_gate + 1,N):
                res = res + (N - i) * arr
            return res
      else:
            for i in range(0,up_gate):
                res = res + (i + 1)*arr
            for i in range(up_gate,down_gate + 1):
                res = res + (N - n + 1) * arr
            for i in range(down_gate + 1,N):
                res = res + (N - i) * arr
            return res
            
               
    if arr == []:
      return 0
   
    res = 0
    N = len(arr)
    for i in range(1,N + 1):
      res = res + inner(i)
    return res

newbison 发表于 2020-1-22 18:20:15

上一题不会,这一题我用递归来解决吧。实在看不懂你们的高深的方法。def func312(array):
    l = len(array)
    res = 0
    if l == 1:
      res = array
    elif l == 2:
      res = array + array + (array + array)
    else:
      res = func312(array[:(l-1)])
      for i in range(0, l):
            res += add(array)
    #递归法解决该问题,每添加一个元素,多出来的数组统统加一遍
    return res

def add(array):
    res = 0
    for each in array:
      res += each
    return res


print('array 的答案是: ', func312())
print('array 的答案是: ', func312())
print('array 的答案是: ', func312())

fan1993423 发表于 2020-1-22 19:55:41

def fun312(lst):
    t=[]
    for i in range(1,len(lst)+1):
      for j in range(len(lst)-i+1):
            t.extend(lst)
    return sum(t)
可能效率低哈
页: [1] 2
查看完整版本: Python:每日一题 312