力扣之仅仅反转字母(双指针方式)

题目描述

给你一个字符串 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('') // 操作完以后,再转回字符串
};

提交结果图

还行...

每一个不曾起舞的日子,都是对生命的辜负

830 声望
553 粉丝
0 条评论
推荐阅读
什么?都2023年了你居然还不会table表头单元格合并?(附el-table单行、多级表头多个案例)
问题描述本文记录el-table表头合并的多种情况,并提出对应解决方案,估计能帮到部分道友原生table知识点复习我们知道:一个简单的table表格一般由一个或多个tr、th或td标签组成(嵌套)tr标签定义表格行(table-r...

水冗水孚2阅读 771

封面图
【每日一题】T 秒后青蛙的位置
1377. T 秒后青蛙的位置关键词:深度优先题目来源:1377. T 秒后青蛙的位置 - 力扣(Leetcode)题目描述 {代码...} 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下:在...

字节幺零二四阅读 683

封面图
【算法竞赛】力扣周赛(节选)2022-04-30
力扣周赛(节选)2022-04-306404. 将数组清空关键词:树状数组、找规律题目来源:6404. 将数组清空 - 力扣(Leetcode)——力扣第 103 场双周赛第4题题目描述 {代码...} 给你一个包含若干 互不相同 整数的数组 nums...

字节幺零二四阅读 665

封面图
【每日一题】翻转子数组得到最大的数组值
给你一个整数数组 nums 。「数组值」定义为所有满足 0 &lt;= i &lt; nums.length-1 的 |nums[i]-nums[i+1]| 的和。

字节幺零二四阅读 616

封面图
算法 - 链表 - 双指针
力扣 第2题 : 两数相加 {代码...} 解法:双指针解释在注释代码中 {代码...}

我有切糕阅读 589

【每日一题】摘水果
在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] = [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排...

字节幺零二四阅读 553

封面图
【每日一题】使二叉树所有路径值相等的最小代价
给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子 2 * i 和右孩子 2 * i + 1 。

字节幺零二四阅读 479

封面图

每一个不曾起舞的日子,都是对生命的辜负

830 声望
553 粉丝
宣传栏