仅仅反转字母

172 阅读1分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第10天,点击查看活动详情

题目描述

给你一个字符串 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 不含 '"' 或 '\'

思路分析

从题目中知,在给定的字符串s中,只反转字母的字符串,除字母以外的所有字符串都不动,无论是符号还是中文。我们的目的是想反转字母的字符串,那么其他的字符串都没用到,我们可以将其全部过去掉,剩下的字符串只要翻转一下就可以,再将其他的字符按原来的顺序放会字符串里。由于需要将字符串翻转一下,所以将字符串换成数组就更好操作点,这样就可以利用数组的reverse()方法翻转一下;将字符串转成数组,再将数组翻转一下,循环遍历翻转后的数组,将除字母以外的所有字符串串全部过滤掉,这样剩下的数组就是纯字母的数组了(并且是翻转后的);遍历原字符串记住除字母以外的字符串的位置,将它们全部按原来的位置相应的添加到数组里面,然后再将数组转换成字符串就可以了。

AC代码

 let s = 'a-bC-dEf-ghIj';
function reverseOnlyLetters(str) {
   let arr = str.split('').reverse();
   let leng = arr.length;
   for(let i=0;i<=leng;i++) {
       if(!((arr[i] >= 'a' && arr[i] <= 'z') || (arr[i] >= 'A' && arr[i] <= 'Z'))) {
           arr.splice(i, 1);
       }
   }
   console.log(arr);
   for(let i=0; i<str.length; i++) {
    if(!((str[i] >= 'a' && str[i] <= 'z') || (str[i] >= 'A' && str[i] <= 'Z'))) {
        arr.splice(i, 0, str[i]);
    }
   }
   console.log(arr.join(''));
}
reverseOnlyLetters(s)