algo›problem
力扣第124场双周赛
昨天晚上第一次参加力扣的竞赛,在最后半个小时,终于答对了一道简单题。算是在力扣里面走出了第一步了。
题目给出一个整数数组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;
}
}
Python3
class Solution:
def maxOperations(self, nums: List[int]) -> int:
count = 0
score = nums[0] + nums[1]
for i in range(0, len(nums), 2):
if i+1 < len(nums): # 防止数组越界
_score = nums[i] + nums[i+1]
if score == _score:
count += 1
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)