给你一个字符串 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!"
这题用双指针就可以了。如果不知道什么是双指针,建议看看这篇文章http://t.csdn.cn/Xhdu2
两边同时搜索,遇到非字母就跳过,当左右都是字母,就交换位置。
我是用C写的,一开始代码和官方代码差不多,但是速度差了很多,原因是负责交换的swap函数前面没有加一手static inline。
inline这个东西说起来比较麻烦,直接简单理解成它可以加在一些简单函数前面,减少调用的时间。
在这道题里,swap交换函数要用到很多次,加入inline可以减少很多程序执行时间。
最后附上代码:
static inline void swap(char *c1, char *c2) {//内联函数
char tmp = *c1;
*c1 = *c2;
*c2 = tmp;
}
bool judge(char c){
if((c>='a'&&c<='z')||(c>='A'&&c<='Z')){
return true;
}
return false;
}
char *reverseOnlyLetters(char *s){
int n = strlen(s);
int left = 0, right = n - 1;
while (true) {
while (left < right && !judge(s[left])) {
left++;
}
while (right > left && !judge(s[right])) {
right--;
}
if (left >= right) {
break;//结束条件
}
//上面三个基本上都是模板了
swap(s+left, s+right);
//交换完了记得继续往下遍历
left++;
right--;
}
return s;
}
顺带一提,可以直接用isalpha函数来判断是否是字母。