leetcode刷题记录-917. 仅仅反转字母-双指针

154 阅读1分钟

「这是我参与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 不含 '"' 或 '\'

题解

双指针解法

解析

头尾字母互换,第一时间想到双指针的解法,并且双指针还能够去判断当前位置是否是字母,不是字母能够进行跳过操作。

  1. 双指针分别从头和尾向中靠拢,合并后则退出

  2. 当前如果都为字符串,则换位

  3. 当前如果有哪一个指针的位置不为字符串,则当前位置向中间挪一位,也就是跳过不是字符串的位置

  4. 最后将得到的结果返回,就是反转后的字符串

图解

我们拿一个测试用例做一个图解,假设数据为 "a-bC-dEf-ghIj":

  1. 从头尾开始,当前位置都为字符串,则进行反转,并且双指针前进。

image.png

  1. 左边指针碰到了不为字符串,则左边指针前进,右边不动。

image.png

  1. 一直进行,直到两个指针重合后结束。

代码

/**
 * @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('')
};

image.png