青训营X豆包MarsCode 技术训练营之学习方法与心得| 豆包MarsCode AI 刷题

47 阅读1分钟

一.题目: 小R定义了一个长度为 m 的数组 b 的权值为:1×b_1 + 2×b_2 + 3×b_3 + ... + m×b_m。

现在小R有一个长度为 n 的数组 a,她想知道所有子数组的权值和是多少,并且答案需要对 10^9 + 7 取模。

测试样例

样例1:

输入:n = 3, a = [1, 2, 3]
输出:33

样例2:

输入:n = 4, a = [4, 5, 6, 7]
输出:203

样例3:

输入:n = 2, a = [10, 20]
输出:80

二.解题思路

  1. 子数组的定义:对于一个长度为 n 的数组 a,其子数组可以是任意长度的连续子序列。
  2. 权值的计算:对于每个子数组 b,其权值为 1×b_1 + 2×b_2 + 3×b_3 + ... + m×b_m
  3. 总权值的计算:我们需要计算所有可能子数组的权值和。

三.编写代码:

def solution(n: int, a: list) -> int:
    MOD = 10**9 + 7
    total_weight = 0
    
    # 遍历所有可能的子数组
    for start in range(n):
        current_weight = 0
        for end in range(start, n):
            # 更新当前子数组的权值
            current_weight += (end - start + 1) * a[end]
            total_weight = (total_weight + current_weight) % MOD
    
    return total_weight

if __name__ == '__main__':
    print(solution(3, [1, 2, 3]) == 33)
    print(solution(4, [4, 5, 6, 7]) == 203)
    print(solution(2, [10, 20]) == 80)

四. 关键步骤解释

  1. 遍历所有子数组:我们使用两个嵌套循环来遍历所有可能的子数组。start 是子数组的起始位置,end 是子数组的结束位置。
  2. 计算当前子数组的权值:对于每个子数组 a[start:end+1],我们计算其权值并累加到 total_weight 中。
  3. 取模操作:每次累加权值时,我们都对结果取模 10^9 + 7,以防止溢出。