On this page
algoproblem

力扣第124场双周赛

About 743 wordsAbout 2 min

algoleetcode-biweekly-match

2024-02-18

昨天晚上第一次参加力扣的竞赛,在最后半个小时,终于答对了一道简单题。算是在力扣里面走出了第一步了。

100221. 相同分数的最大操作数目 I

题目给出一个整数数组nums,如果nums至少包含2个元素,你可以执行一下操作:

  • 选择nums中前两个元素并将他们删除

一次操作的分数是被删除元素的和

在确保所有操作分数相同的前提下,请你求出最多能进行多少次操作。

看给出的题目样例,我们只需要保存前两个元素的和,然后依次向后遍历两位,如果值与前面两位相同,次数加一,不相等的话,就直接返回。

这里有几个注意点:

1、如果是用for循环,步长为2来处理的话,需要判断是否下表越界,因为有些数组是奇数个,有些是偶数个,这样导致最后只存在一个元素的情况。

2、第二个就是,如果中间存在着不满足条件的元素,需要直接返回

Java
class Solution {
    public int maxOperations(int[] nums) {
        int count = 0;
        int score = nums[0] + nums[1];
        int n = nums.length;
        for(int i=0;i<n;i=i+2){
            if(i+1<n){
                int _score = nums[i] + nums[i+1];
                if(score == _score){
                    count++;
                }
                else{
                    break;
                }
            }
        }
        return count;
    }
}

3039. 进行操作使字符串为空

给你一个字符串s

请你进行以下操作直到s为空

  • 每次操作一次遍历a到z,如果当前字符出现在s中,那么删除出现位置最早的字符。

请你返回最后一次操作之前的字符串s

参考灵神给出的题解。

作者:灵茶山艾府 统计字母出现次数和最后一次出现的下标(Python/Java/C++/Go)

提示 1 最后一次操作时,剩下的字母互不相同。(因为如果有相同字母,那么操作后还有剩余字母。)

提示 2 设字母的最大出现次数为mx

由于删除是从左到右进行的,最后剩下的就是出现次数等于 mx\textit{mx}mx 的靠右字母(相同字母取出现位置最右的)。

class Solution:
    def lastNonEmptyString(self, s: str) -> str:
        last = {c: i for i, c in enumerate(s)}
        cnt = Counter(s)
        mx = max(cnt.values())
        ids = sorted(last[ch] for ch, c in cnt.items() if c == mx)
        return ''.join(s[i] for i in ids)