所属栏目:C++系统性学习_Jason_from_China的博客-优快云博客
所属栏目:C++知识点的补充_Jason_from_China的博客-优快云博客
码云Gitee:贾杰森 (jiajiesen) - Gitee.com
仅仅反转字符串
题目:
思路
代码实现
class Solution { public: bool isLetter(char ch) { if (ch >= 'a' && ch <= 'z') return true; if (ch >= 'A' && ch <= 'Z') return true; return false; } string reverseOnlyLetters(string S) { if (S.empty()) return S; size_t begin = 0, end = S.size() - 1; //跳过非字母字符 while (begin < end) { while (begin < end && !isLetter(S[begin])) ++begin; while (begin < end && !isLetter(S[end])) --end; //交换 swap(S[begin], S[end]); ++begin; --end; } return S; } };
isLetter函数
- 首先,判断字符
ch
是否在小写英文字母'a'
到'z'
的 ASCII 码值范围之内(在 ASCII 编码体系中,小写字母是连续编码的)。如果满足这个条件,说明ch
是小写英文字母,此时直接返回true
。- 接着,如果
ch
不满足小写字母的范围条件,就进一步检查它是否在大写英文字母'A'
到'Z'
的 ASCII 码值范围之内(同样,大写字母在 ASCII 编码中也是连续编码的)。若满足该范围条件,则意味着ch
是大写英文字母,同样返回true
。- 最后,如果上述两个条件都不满足,也就是该字符既不是小写字母也不是大写字母,那就返回
false
,表示这个字符不是英文字母。reverseOnlyLetters函数
- 功能:
此函数用于对输入的字符串S
进行处理,将其中的字母字符逆序排列,而非字母字符的位置保持不变,最后返回处理后的字符串。- 逻辑详细解释:
- 边界情况检查:
首先通过if (S.empty()) return S;
语句来处理输入字符串为空的情况。如果字符串为空,直接将其返回,不做任何处理。- 初始化指针:
定义了两个size_t
类型(无符号整数类型,常用于表示数组、容器等的大小、索引等情况)的变量begin
和end
,分别初始化为0
和S.size() - 1
,也就是让begin
指向字符串的开头字符,end
指向字符串的末尾字符,准备从字符串的两端开始进行操作。- 跳过非字母字符的循环逻辑:
有两个嵌套的while
循环用于跳过非字母字符。
- 外层的主
while
循环条件是begin < end
,确保在字符串还没有完全遍历完(两端还未相遇)的情况下继续操作。- 第一个内层
while
循环:while (begin < end &&!isLetter(S[begin])) ++begin;
,这个循环的作用是从字符串的开头(由begin
指向)开始,只要当前字符(通过S[begin]
获取)不是英文字母(通过调用isLetter
函数判断并取反,即!isLetter
),就将begin
指针向后移动一位(++begin
),直到遇到英文字母为止。- 第二个内层
while
循环:while (begin < end &&!isLetter(S[end])) --end;
,它的功能和第一个内层while
循环类似,不过是从字符串的末尾(由end
指向)开始,只要当前字符(通过S[end]
获取)不是英文字母,就将end
指针向前移动一位(--end
),直至遇到英文字母。- 交换字母字符:
当两个内层while
循环分别跳过开头和末尾的非字母字符后,此时begin
和end
指向的都是字母字符,通过swap(S[begin], S[end]);
语句交换这两个位置上的字母字符,实现字母字符的逆序效果。- 指针移动:
交换完成后,通过++begin
和--end
语句分别将begin
指针向后移动一位,end
指针向前移动一位,然后继续外层的while
循环,重复上述跳过非字母字符和交换字母字符的过程,直到begin
和end
相遇(意味着整个字符串已经按照要求处理完毕)。- 返回结果:
最后,将处理后的字符串S
返回,这个返回的字符串就是原字符串中字母字符逆序排列后的结果,非字母字符位置保持不变。
代码简化
class Solution { public: //判断是不是字符 string reverseOnlyLetters(string s) { //判空 if(s.empty()) return s; size_t begin = 0 , end = s.size() - 1; while(begin < end) { //找到字符 while(begin < end && !isalpha(s[begin])) begin++; while(begin < end && !isalpha(s[end])) end--; swap(s[begin],s[end]); ++begin; --end; } return s; } };
isalpha:用于判断一个字符是否为字母,包括大写字母(
A - Z
)和小写字母(a - z
)