• LeetCode --- 字符串系列 --- 反转字符串


    反转字符串

    小提示:到现在,做了十几道算法题,发现算法要简洁快速,要善于使用 while


    题目

    编写一个函数,其作用是将输入的字符串反转过来。

    输入字符串以字符数组 char[] 的形式给出。

    不要给另外的数组分配额外的空间

    你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

    你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。


    示例

    示例 1:
    
    输入:["h","e","l","l","o"]
    输出:["o","l","l","e","h"]
    
    示例 2:
    
    输入:["H","a","n","n","a","h"]
    输出:["h","a","n","n","a","H"]
    

    来源:力扣(LeetCode)

    链接:https://leetcode-cn.com/problems/reverse-string

    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


    解题思路

    1、初始计算
    `字符串数组` 的长度的一半 `half`
    `字符串数组` 的长度是否为奇数 `odd`
    交换位置从 `字符串数组` 尾部开始,得到 `j` =  `字符串数组` 长度 - 1
    
    2、循环 `字符串数组` ,首部从 `0` 开始,交换首尾位置,前后位置不断靠近交换
    
    3、
    3、1
    若字符数组长度为 `奇数` ,且交换下标 `小于等于` 字符数组长度的一半 `half` ,即可跳出
    例如:0 1 2 3 4 --- j 必须 `小于等于` 2,处于中间位置,不用操作
    
    3、2
    若字符数组长度为 `偶数` ,且交换下标 `小于` 字符数组长度的一半 `half` ,即可跳出
    例如:0 1 2 3 --- j 必须 `小于` 2,等于 2 的时候还要再交换一次
    

    或者

    较好力扣题解

    1、循环 `字符串数组`,i 为首部交换位,j 为尾部交换位
    
    2、使用 ES 新特性交换位置
    [a, b] = [b, a]
    
    3、使用 while 循环
    判断 `i <= j` 说明还没交换完成,继续循环交换
    否则交换完成,跳出
    

    题解

    let reverseString = function(s) {
        let temp = 0 // 用于交换的临时变量
        let j = s.length - 1 // 交换下标的初始位置
        let odd = s.length % 2 // 字符数组长度是否为奇数
        let half = Math.floor(s.length / 2) // 字符数组长度的一半
        for (let i = 0; i < s.length; i++) {
            // 循环字符数组,交换首尾位置,前后位置不断靠近交换
            temp = s[j]
            s[j] = s[i] // i 位置的值,赋值给 j 位
            s[i] = temp // i 的值为之前暂存起来的 j 位值
            j--
            // console.log('s :', s);
            if ((odd && j <= half) || (!odd && j < half)) {
                // 0 1 2 3 4 --- j 必须 小于等于 2,处于中间位置,不用操作
                // 若字符数组长度为 `奇数` ,且交换下标 `小于等于` 字符数组长度的一半
                // 即可跳出
                
                // 或者
                // 0 1 2 3 --- j 必须 小于 2,等于 2 的时候还要再交换一次
                // 若字符数组长度为 `偶数` ,且交换下标 `小于` 字符数组长度的一半
                // 即可跳出
                break
            }
        }
        return s
    }
    

    或者

    较好力扣题解

    let reverseString = function(s) {
        let i = 0, j = s.length - 1
        // 使用 ES 新特性交换位置
        // [a, b] = [b, a]
        while (i <= j) {
            [s[i], s[j]] = [s[j], s[i]]
            // 交换完成后,前交换位 +1,后交换位 -1
            // 直到 前交换位 大于 后交换位,说明交换完成 
            i++
            j--
        }
        return s
    }
    

  • 相关阅读:
    BZOJ3514:GERALD07加强版(LCT,主席树)
    BZOJ2729:[HNOI2012]排队(组合数学)
    BZOJ4517:[SDOI2016]排列计数(组合数学,错排公式)
    BZOJ3123:[SDOI2013]森林(主席树,启发式合并)
    BZOJ3786:星系探索(Splay,括号序)
    BZOJ2212:[POI2011]Tree Rotations(线段树合并)
    BZOJ5329:[SDOI2018]战略游戏(圆方树,虚树)
    CF613D:Kingdom and its Cities(树形DP,虚树)
    BZOJ3611:[HEOI2014]大工程(树形DP,虚树)
    BZOJ2286:[SDOI2011]消耗战(树形DP,虚树)
  • 原文地址:https://www.cnblogs.com/linjunfu/p/12658148.html
Copyright © 2020-2023  润新知