系列文章目录
【拒绝算法PUA】0x00-位运算
【拒绝算法PUA】0x01- 区间比较技巧
【拒绝算法PUA】0x02- 区间合并技巧
【拒绝算法PUA】0x03 - LeetCode 排序类型刷题
【拒绝算法PUA】LeetCode每日一题系列刷题汇总-2025年持续刷新中
C++刷题技巧总结:
[温习C/C++]0x04 刷题基础编码技巧
LeetCode 3019. 按键变更的次数
链接
题目
给你一个下标从 0 开始的字符串 s ,该字符串由用户输入。按键变更的定义是:使用与上次使用的按键不同的键。例如 s = "ab" 表示按键变更一次,而 s = "bBBb" 不存在按键变更。
返回用户输入过程中按键变更的次数。
注意:shift 或 caps lock 等修饰键不计入按键变更,也就是说,如果用户先输入字母 'a' 然后输入字母 'A' ,不算作按键变更。
示例 1:
输入:s = "aAbBcC"
输出:2
解释:
从 s[0] = 'a' 到 s[1] = 'A',不存在按键变更,因为不计入 caps lock 或 shift 。
从 s[1] = 'A' 到 s[2] = 'b',按键变更。
从 s[2] = 'b' 到 s[3] = 'B',不存在按键变更,因为不计入 caps lock 或 shift 。
从 s[3] = 'B' 到 s[4] = 'c',按键变更。
从 s[4] = 'c' 到 s[5] = 'C',不存在按键变更,因为不计入 caps lock 或 shift 。
示例 2:
输入:s = "AaAaAaaA"
输出:0
解释: 不存在按键变更,因为这个过程中只按下字母 'a' 和 'A' ,不需要进行按键变更。
提示:
1 <= s.length <= 100
s 仅由英文大写字母和小写字母组成。
解题方法1
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
int countKeyChanges(string s)
{
if (s.empty()) {
return 0;
}
char prev = s[0]; // 这里也是关键点,将首个字符作为prev
int res = 0;
for (int i = 1; i < s.size(); i++) { // i = 1 这里是关键点
char lower = tolower(prev);
char upper = toupper(prev);
if (s[i] != lower && s[i] != upper) {
prev = s[i];
res++;
continue;
}
prev = s[i];
}
return res;
}
};