执行结果:通过
执行用时和内存消耗如下:



int countKeyChanges(char* s) {
int count=0,i=0;
while(s[i]!='\0'){
if((s[i]!=s[i+1])&&(s[i]!=(s[i+1]+32))&&(s[i]!=(s[i+1]-32))&&s[i+1]!=0)count++;
i++;
}
return count;
}
解题思路:
- 初始化变量 :
count
:用于记录键变化的次数,初始化为0。i
:用于遍历字符串的索引,初始化为0。
- 遍历字符串 :
- 使用
while
循环遍历字符串,直到遇到字符串的结束符\0
。
- 使用
- 检查相邻字符 :
- 在每次循环中,检查当前字符
s[i]
和下一个字符s[i+1]
是否满足以下条件之一:s[i] != s[i+1]
:两个字符不相同。s[i] != (s[i+1] + 32)
:当前字符不是下一个字符的小写形式(假设ASCII码,小写字母比对应大写字母大32)。s[i] != (s[i+1] - 32)
:当前字符不是下一个字符的大写形式。s[i+1] != 0
:确保s[i+1]
不是字符串结束符(虽然这个条件在while
循环的条件中已经隐含,但这里再次检查可以避免访问未定义内存)。
- 如果上述所有条件都不满足,说明两个字符要么相同,要么是大小写关系(例如,'A' 和 'a'),此时不计入键变化次数。
- 如果上述任一条件满足,说明发生了键变化,将
count
增加1。
- 在每次循环中,检查当前字符
- 索引递增 :
- 每次循环结束时,将索引
i
增加1,以移动到下一个字符。
- 每次循环结束时,将索引
- 返回结果 :
- 当遍历完整个字符串后,返回
count
,即总的键变化次数。
- 当遍历完整个字符串后,返回
注意 :代码中有一个小细节需要注意,即 (s[i+1]!=0)
这个条件在 while
循环的条件中已经通过 s[i]!='\0'
隐含地确保了 s[i+1]
的存在(除非 s[i]
是字符串的最后一个字符),因此这个条件实际上是多余的,可以省略。