解题思路
题目:
给你一个字符串 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!”
根据题目要求,可以利用双指针,从字符串的左侧和右侧分别进行检测,如果当前左右两侧都是字母,那么交换两个字母,如果左侧的字符不是字母,那么跳过当前的值,l++,如果右侧的字符不是字母,跳过当前的下标,r—,循环成立的条件是l<r
代码
const isChar = (code)=>{
return (code >= 65 && code <=90) || (code >= 97 && code <=122)
}
var reverseOnlyLetters = function(s) {
const len = s.length;
const arr = [...s]
let l = 0,r = len -1;
while(l<len && l < r){
const codeL = isChar(s.charCodeAt(l));
const codeR = isChar(s.charCodeAt(r));
if(codeL && codeR){
const swap = arr[l];
arr[l] = arr[r];
arr[r] = swap;
l++;
r--;
}else if(!codeL && codeR){
l++;
}else if(codeL && !codeR){
r--;
}else{
l++;
r--;
}
}
return arr.join('');
};
优化
根据题解,可以看到值得优化的在于判断一个字符是否是字母时,可以使用正则表达式来进行判断
const isChar = (s)=>{
return /[a-zA-z]/.test(s)
}
var reverseOnlyLetters = function(s) {
const len = s.length;
const arr = [...s]
let l = 0,r = len -1;
while(l<len && l < r){
const codeL = isChar(s[l]);
const codeR = isChar(s[r]);
if(codeL && codeR){
const swap = arr[l];
arr[l] = arr[r];
arr[r] = swap;
l++;
r--;
}else if(!codeL && codeR){
l++;
}else if(codeL && !codeR){
r--;
}else{
l++;
r--;
}
}
return arr.join('');
};
总结
双指针的使用