环形数组中的最大贡献值、最少字符串操作次数 | 豆包MarsCode AI刷题

119 阅读3分钟

今天又做了两道豆包MarsCode AI刷题题库中的中等题:环形数组中的最大贡献值、最少字符串操作次数,分享一下我的做题经过。

环形数组中的最大贡献值

问题描述

小S拿到了一个长度为 nn 的环形数组,并定义了两个下标 ii 和 jj 的贡献值公式为:
f(i, j) = (a_i + a_j) × dist(i, j)
其中 dist(i, j) 是下标 ii 和 jj 在数组中的最短距离。小S希望找到一对下标,使得它们的贡献值尽可能大。环形数组的特点是最左和最右的元素也是相邻的。你需要帮助她找到最大贡献值。

例如,给定数组 [1, 2, 3],由于是环形数组,任意两个下标的距离都是1,因此 f(2,3)=(2+3)×1=5f(2,3)=(2+3)×1=5。

测试样例

样例1:

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

样例2:

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

样例3:

输入:n = 5,a = [1, 5, 3, 7, 2]
输出:24

解题思路

使用一个双层遍历,外层遍历数组中第一个到倒数第二个元素(最后一个元素不用单独遍历,在前面元素的计算中已经考虑到),里层分别计算每个元素所能得到的最大贡献值。题目有一特殊条件是这是个环形数组,将第一个元素和最后一个元素看作是连通的,因此计算两个元素的最短距离时,要取分别从两个方向上算的最小值。

代码实现

def calcu_contribution(index, n, a):
    max_contribution = 0
    for i in range(index+1, n):
        contribution = (a[index]+a[i]) * min(i-index, index+n-i)
        if contribution > max_contribution:
            max_contribution = contribution
    return max_contribution

def solution(n: int, a: list) -> int:
    max_contribution = 0
    for i in range(n-1):
        contribution = calcu_contribution(i, n, a)
        if contribution > max_contribution:
            max_contribution = contribution
    return max_contribution

最少字符串操作次数

问题描述

小U得到一个只包含小写字母的字符串 S。她可以执行如下操作:每次选择字符串中两个相同的字符删除,然后在字符串末尾添加一个任意的小写字母。小U想知道,最少需要多少次操作才能使得字符串中的所有字母都不相同?

测试样例

样例1:

输入:S = "abab"
输出:2

样例2:

输入:S = "aaaa"
输出:2

样例3:

输入:S = "abcabc"
输出:3

解题思路

使用一个字典统计字符串S里各字符的个数,函数if_all_unique()判断目前字典内的字符是否有出现次数大于1的情况。使用while循环,在不满足if_all_unique()的情况下,每次选择一个出现次数大于1的元素,将它的值减去2,操作次数加1。

代码实现

def if_all_unique(dicts):
    flag = True
    for key, value in dicts.items():
        if value > 1:
            flag = False
            break
    return flag

def solution(S: str) -> int:
    dicts ={}
    for i in S:
        if i not in dicts:
            dicts[i] = 1
        else:
            dicts[i] += 1

    flag = False
    count = 0
    while not flag:
        for key, value in dicts.items():
            if value > 1:
                dicts[key] -= 2
                count += 1
                break
        flag = if_all_unique(dicts)

    return count