「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」
前言
今日的题目为简单,要是能想到利用双指针解题,那么这道题就非常的简单,所以说简单题仅仅知识一个思路的问题,并不会涉及复杂的算法。
每日一题
今天的每日一题 917. 仅仅反转字母,难度为简单
-
给你一个字符串 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 不含 '"' 或 '\'
题解
双指针解法
解析
头尾字母互换,第一时间想到双指针的解法,并且双指针还能够去判断当前位置是否是字母,不是字母能够进行跳过操作。
-
双指针分别从头和尾向中靠拢,合并后则退出
-
当前如果都为字符串,则换位
-
当前如果有哪一个指针的位置不为字符串,则当前位置向中间挪一位,也就是跳过不是字符串的位置
-
最后将得到的结果返回,就是反转后的字符串
图解
我们拿一个测试用例做一个图解,假设数据为 "a-bC-dEf-ghIj":
- 从头尾开始,当前位置都为字符串,则进行反转,并且双指针前进。
- 左边指针碰到了不为字符串,则左边指针前进,右边不动。
- 一直进行,直到两个指针重合后结束。
代码
/**
* @param {string} s
* @return {string}
*/
var reverseOnlyLetters = function(s) {
let l = 0
let r = s.length-1
const arr = [...s];
while(l <= r){
let lasc = arr[l].charCodeAt()
let rasc = arr[r].charCodeAt()
if ((lasc < 65 || lasc > 90 && lasc < 97 || lasc > 122)) {
l++
continue
}
if((rasc < 65 || rasc > 90 && rasc < 97 || rasc > 122)){
r--
continue
}
let t = arr[l]
arr[l] = arr[r]
arr[r] = t
l++
r--
}
return arr.join('')
};