一起养成写作习惯!这是我参与「掘金日新计划 · 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 <= 100s仅由 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)