题目描述
给你一个字符串 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!"
力扣原题目地址:https://leetcode.cn/problems/...
思路分析
通过题目我们可以得出几个关键词需求:
- 需要判断英文字母和非英文字母
- 英文字母字符串位置反转,即交换位置
判断英文字母和非英文字母
我们可以通过字符串的charCodeAt方法
去做区间判断
,或者定义一个变量字符串存储所有的大小写应为字母
charCodeAt方法
即为 [65,90] | [97,122]
区间内的都是英文字母
变量字符串
封装函数方便判断
function isLetter(s) {
let str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
return str.includes(s)
}
也是枚举思想,即判断某一个值,是否在所有的枚举值中...
英文字母字符串位置交换
注意!注意!注意!这里有一个坑!
我们知道,数组中的两项如果要交换位置,直接定义一个临时变量,去通过索引交换位置即可。如下:
let arr = ['甲', '乙', '丙', '丁']
let temp
temp = arr[0]
arr[0] = arr[3]
arr[3] = temp
console.log(arr); // ['丁', '乙', '丙', '甲']
数组直接可以交换成功,但是字符串直接交换不成功!如下:
let str = 'abcd'
let temp
temp = str[0]
str[0] = str[3]
str[3] = temp
console.log(str); // abcd
是的,打印出来的str
并不是dbca
,所以如果我们想要交换字符串中的字母的位置,需要,将字符串转成数组交换位置以后,再转回来。
代码
通过上述的分析,结合双指针交换位置的操作,于是我们得出以下代码:
// 判断是否是大小写英文字母
function isLetter(s) {
let str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
return str.includes(s)
}
var reverseOnlyLetters = function (s) {
s = s.split('') // 字符串转数组
let l = 0 // 左侧指针
let r = s.length - 1 // 右侧指针
while (l < r) {
if (!isLetter(s[l])) { // 左边不是字母,左边往右走
l = l + 1
}
if (!isLetter(s[r])) { // 右边不是字母,右边往左走
r = r - 1
}
if (isLetter(s[l]) & isLetter(s[r])) { // 如果左右都是字母,才交换值,相向而行
let temp;
temp = s[l]
s[l] = s[r]
s[r] = temp
l = l + 1
r = r - 1
}
}
return s.join('') // 操作完以后,再转回字符串
};
提交结果图
还行...
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。