题目地址

解题思路

题目:

给你一个字符串 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

代码

  1. const isChar = (code)=>{
  2. return (code >= 65 && code <=90) || (code >= 97 && code <=122)
  3. }
  4. var reverseOnlyLetters = function(s) {
  5. const len = s.length;
  6. const arr = [...s]
  7. let l = 0,r = len -1;
  8. while(l<len && l < r){
  9. const codeL = isChar(s.charCodeAt(l));
  10. const codeR = isChar(s.charCodeAt(r));
  11. if(codeL && codeR){
  12. const swap = arr[l];
  13. arr[l] = arr[r];
  14. arr[r] = swap;
  15. l++;
  16. r--;
  17. }else if(!codeL && codeR){
  18. l++;
  19. }else if(codeL && !codeR){
  20. r--;
  21. }else{
  22. l++;
  23. r--;
  24. }
  25. }
  26. return arr.join('');
  27. };

优化

根据题解,可以看到值得优化的在于判断一个字符是否是字母时,可以使用正则表达式来进行判断

  1. const isChar = (s)=>{
  2. return /[a-zA-z]/.test(s)
  3. }
  4. var reverseOnlyLetters = function(s) {
  5. const len = s.length;
  6. const arr = [...s]
  7. let l = 0,r = len -1;
  8. while(l<len && l < r){
  9. const codeL = isChar(s[l]);
  10. const codeR = isChar(s[r]);
  11. if(codeL && codeR){
  12. const swap = arr[l];
  13. arr[l] = arr[r];
  14. arr[r] = swap;
  15. l++;
  16. r--;
  17. }else if(!codeL && codeR){
  18. l++;
  19. }else if(codeL && !codeR){
  20. r--;
  21. }else{
  22. l++;
  23. r--;
  24. }
  25. }
  26. return arr.join('');
  27. };

总结

双指针的使用