LeetCode344-反转字符串 | 算法练习系列

331 阅读2分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

前言

js每日一道算法题,今天来一道非常简单的数组相关算法题,来找找自信,要不然要被打击的不想看算法题了,哈哈,下面看下具体题目

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

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

 

示例 1:

输入:s = ["h","e","l","l","o"]

输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]

输出:["h","a","n","n","a","H"]

思路分析

  • 本题是一道简单的数组处理题目,从题目中我们可以观察出来翻转前的数组的下标和翻转后的下边的对应关系是,s[x]=s[n-x-1],也就是说假设反转前字符数组为 s[0] s[1] s[2] ... s[N - 1],那么反转后字符数组为 s[N - 1] s[N - 2] ... s[0]
  • 由于上面的这种管理,我们可以用双指针来解决这个问题,分别定义两个指针,分别为left和right,left的初始位置指向数组的头部,right的初始位置指向数组的末尾,然后声明一个变量,把指针当前指向的项进行位置兑换
  • 巡行到left不满足小于right的情况下,结束即可,这时得到的结果就是我们反转后的结果,代码如下
/**
 * @param {character[]} s
 * @return {void} Do not return anything, modify s in-place instead.
 */
var reverseString = function(s) {
    //声明指针left和right,并分别指向头部和尾部
    let left = 0
    let right = s.length-1
    let curr = null
    //当left<right的时候说明还没反转完所有的项
    while(left < right){
        curr = s[left]
        s[left] = s[right]
        s[right] = curr
        //每次反转两个项后就移动两个指针
        left++
        right--
    }
};
  • 上面的代码还有更简便的写法,如下代码
var reverseString = function(s) {
    const n = s.length;
    for (let left = 0, right = n - 1; left < right; ++left, --right) {
        [s[left], s[right]] = [s[right], s[left]];
    }
};
  • 代码量瞬间少了好几行,也不用用中间变量来做赋值转换,但其实大致思路是相同的,只是再代码实现上做了精简和优化

总结

今天这道算法题非常简单,就跟1+1等于2一样,如果面试都是这种题目就好了,但面试的算法题不可能如此简单,继续努力了,gogogo