第六届字节跳动青训营第四课 | 豆包MarsCode AI 刷题

70 阅读3分钟

连续子串和的整除问题

问题描述

小M是一个五年级的小学生,今天他学习了整除的知识,想通过一些练习来巩固自己的理解。他写下了一个长度为 n 的正整数序列 a_0, a_1, ..., a_{n-1},然后想知道有多少个连续子序列的和能够被一个给定的正整数 b 整除。你能帮小M解决这个问题吗?


测试样例

样例1:

输入:n = 3,b = 3,sequence = [1, 2, 3]
输出:3

样例2:

输入:n = 4,b = 5,sequence = [5, 10, 15, 20]
输出:10

样例3:

输入:n = 5,b = 2,sequence = [1, 2, 3, 4, 5]
输出:6

:::success 前缀和对b取余,如果之前有相同余数的说明这两个数之间子序列能被b整除

:::

def solution(n, b, sequence):
    remainder_count = {0:1}
    count = 0
    prefix_sum = 0
    for x in sequence:
        prefix_sum += x
        mod = prefix_sum % b
        if remainder_count.get(mod):
            count += remainder_count[mod]
            remainder_count[mod] += 1
        else:
            remainder_count[mod] = 1

    return count

if __name__ == "__main__":
    #  You can add more test cases here
    sequence = [1, 2, 3]
    print(solution(3, 3, sequence) == 3)

翻转增益的最大子数组和

问题描述

小C面对一个由整数构成的数组,他考虑通过一次操作提升数组的潜力。这个操作允许他选择数组中的任一子数组并将其翻转,目的是在翻转后的数组中找到具有最大和的子数组。小C对这个可能性很感兴趣,并希望知道翻转后的数组中可能得到的最大子数组和是多少。

例如,数组是 1, 2, 3, -1, 4。小C可以选择翻转子数组 -1, 4 得到 1, 2, 3, 4, -1 或者翻转 1, 2, 3, -1 得到 -1, 3, 2, 1, 4,在这两种情况下,最大的子数组和都是 10。

备注:子数组 是数组中的一个连续部分。

输入

  • N: 数组的长度
  • data_array: 一个长度为 N 的整数数组

输出

请你返回执行翻转操作后(也可以选择不翻转),数组中可能获得的最大子数组和。


测试样例

样例1:

输入:N = 5,data_array = [1, 2, 3, -1, 4]
输出:10

样例2:

输入:N = 4,data_array = [-3, -1, -2, 3]
输出:3

样例3:

输入:N = 3,data_array = [-1, -2, -3]
输出:-1

样例4:

输入:N = 6,data_array = [-5, -9, 6, 7, -6, 2]
输出:15

样例5:

输入:N = 7,data_array = [-8, -1, -2, -3, 4, -5, 6]
输出:10

:::success 主程序是遍历,判断最大子数组是用kadane算法

:::

INF = 0x3f3f3f3f3f3f3f
def solution(N, data_array):
    res = -INF
    for i in range(N):
        for j in range(i, N):
            reversed_arr = data_array[i:j+1][::-1]
            max_temp = kadane(data_array[:i] + reversed_arr + data_array[j+1:])
            res = max(max_temp, res)

    return res
    


def kadane(arr):
    max_ending_here = arr[0]
    max_so_far = arr[0]
    for i in arr[1:]:
        max_ending_here = max(i, max_ending_here + i)
        max_so_far = max(max_ending_here, max_so_far)

    return max_so_far

if __name__ == "__main__":
    #  You can add more test cases here
    array1 = [-85, -11, 92, 6, 49, -76, 28, -16, 3, -29, 26, 37, 86, 3, 25, -43, -36, -27, 45, 87, 91, 58, -15, 91, 5, 99, 40, 68, 54, -95, 66, 49, 74, 9, 24, -84, 12, -23, -92, -47, 5, 91, -79, 94, 61, -54, -71, -36, 31, 97, 64, -14, -16, 48, -79, -70, 54, -94, 48, 37, 47, -58, 6, 62, 19, 8, 32, 65, -81, -27, 14, -18, -34, -64, -97, -21, -76, 51, 0, -79, -22, -78, -95, -90, 4, 82, -79, -85, -64, -79, 63, 49, 21, 97, 47, 16, 61, -46, 54, 44]
    print(solution(5, [1,2,3,-1,4]) == 10 )
    print(solution(100, array1) == 1348)

走进http协议

再谈http协议

HTTP:超文本传输协议

需要明确的边界

能够携带的信息

设计合理的API

  • 冗余性
  • 兼容性
  • 可测性
  • 可见性