题目:
给你一个字符串 s
,根据下述规则反转字符串:
- 所有非英文字母保留在原有位置。
- 所有英文字母(小写或大写)位置反转。
返回反转后的 s
。
示例 1:
输入:s = "ab-cd" 输出:"dc-ba"
示例 2:
输入:s = "a-bC-dEf-ghIj" 输出:"j-Ih-gfE-dCba"
示例 3:
输入:s = "Test1ng-Leet=code-Q!" 输出:"Qedo1ct-eeLg=ntse-T!"
提示
1 <= s.length <= 100
s
仅由 ASCII 值在范围[33, 122]
的字符组成s
不含'\"'
或'\\'
代码:
class Solution {
public:
bool IsAlpha(char& ch)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
return true;
}
else
{
return false;
}
}
string reverseOnlyLetters(string s)
{
int left=0;
int right=s.size()-1;
while(left<right)
{
while(left<right&&IsAlpha(s[left])==false)
{
left++;
}
while(left<right&&IsAlpha(s[right])==false)
{
right--;
}
swap(s[left],s[right]);
left++;
right--;
}
return s;
}
};
分析:
在这题中我犯了几个错误:
- 一开始没有返回,即没有return s;这一句,导致报错
Line 37: Char 5: error: non-void function does not return a value in all control paths [-Werror,-Wreturn-type]
37 | }
| ^
1 error generated.
//第37行:字符5:错误:非void函数未在所有控制路径中返回值[-Werror,-Rewesturn-type]
37 | }
| ^
生成1个错误。
2.一开始用的left<=right,出现了如下错误
这导致会多进循环一次,出现错误
即第三次进去时,left为2,right为2,left进入第二个while循环,导致他到了后面一个已经交换过了的字母位置,又进行了一次交换
3.其次在一开始多次判断是否为字母之后,为了让代码更加简便,我封装了函数
bool IsAlpha(char& ch)
{
if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
{
return true;
}
else
{
return false;
}
}