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:15 编辑
哇,楼主真的太勤奋了@zltzlt这个重复元素怎么处理?比如这个您能给示范吗? 迷惑行为。
-> [,,,,,,]
-> [,,,,,,]
阴阳神万物主 发表于 2020-1-22 14:13
迷惑行为。
-> [,,,,,,]
-> [,,,,
子数组必须是连续的 阴阳神万物主 发表于 2020-1-22 14:13
迷惑行为。
-> [,,,,,,]
-> [,,,,
这样的数组 是不是存在两个啊?还是算一个 zltzlt 发表于 2020-1-22 14:18
子数组必须是连续的
哦 TJBEST 发表于 2020-1-22 14:09
哇,楼主真的太勤奋了@zltzlt这个重复元素怎么处理?比如这个您能给示范吗?
和普通数组一样
--> [, , , , , , , , , ...] TJBEST 发表于 2020-1-22 14:19
这样的数组 是不是存在两个啊?还是算一个
两个 本帖最后由 阴阳神万物主 于 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())
阴阳神万物主 发表于 2020-1-22 14:36
要去重另说,但应该不用去重。
解答错误
输入:
输出:147
预期结果:155 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:52 编辑
写成一行的版本def func312(l:list):
return sum((i+1)*(len(l)-i)*l for i in range(len(l))) 看起来测试用例有点长。。。 Croper 发表于 2020-1-22 14:51
写成一行的版本
只是佩服Croper老大的头脑 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 塔利班 发表于 2020-1-22 15:30
佩服... kinkon 发表于 2020-1-22 16:07
佩服...
没有,看了大神的感觉走了点弯路,, 我的代码总是很长,需要改进{: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
上一题不会,这一题我用递归来解决吧。实在看不懂你们的高深的方法。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())
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