[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
仅由英文大写字母和小写字母组成。
题解
解题思路
本题的关键在于判断两个连续字符是否来自不同的按键组。由于题目说明忽略大小写差异,因此可以利用 ASCII 值的特点解决此问题:
字母的大小写之间的 ASCII 值差为 32(如 'a' 和 'A' 的差值为 32)
如果相邻两个字符相等,或它们的差值为 32,则无需变更按键
否则,即使用了不同的按键,按键变更次数增加
通过遍历字符串中的每个字符并比较当前字符与前一个字符的关系,可以高效完成统计
代码实现
class Solution {
public int countKeyChanges(String s) {
int ans = 0;
for (int i = 1; i < s.length(); i++) {
if (Math.abs(s.charAt(i - 1) - s.charAt(i)) == 32 || s.charAt(i - 1) == s.charAt(i)) {
continue;
}
ans++;
}
return ans;
}
}
复杂度分析
时间复杂度:
遍历字符串需要 O(n) 的时间,其中 n 是字符串的长度。在每次迭代中进行简单的比较操作,因此整体时间复杂度为 O(n)空间复杂度:
代码中未使用额外的数据结构,仅用到了常数级的变量存储,空间复杂度为 O(1)
总结
该题通过比较相邻字符的 ASCII 值关系,有效地判断按键是否变更,利用大小写字母的特性简化了逻辑
希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。
License:
CC BY 4.0