🌈【LeetCode 151. 颠倒字符串 】- JavaScript(双指针+API)

483 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情


说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)

作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金

GitHub:P-J27、 CSDN:PJ想做前端攻城狮

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


【LeetCode 151. 颠倒字符串 】- JavaScript(双指针+API)

题目描述

给你一个字符串 s ,颠倒字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1

输入:s = "the sky is blue" 输出:"blue is sky the"

示例 2:

输入:s = " hello world " 输出:"world hello" 解释:颠倒后的字符串中不能存在前导空格和尾随空格。

双指针遍历翻转

思路分析:

  • 首先将字符串转为数组。
  • 再利用双指针法将数组中多余空格剔除。即首位和中间的课余空格。
  • 再把整个字符串数组先翻转一遍。
  • 遍历字符串数组将单个单词进行翻转。
  • 最后将翻转后的结果数组转成字符串进行输出。
var reverseWords = function(s) {
    const strArr = Array.from(s);
    removerExtraSpace(strArr);
    reverse(strArr,0,strArr.length-1);
    let start = 0;
    for(let i = 0;i <= strArr.length;i++) {
        if(strArr[i]===' ' || i===strArr.length) {
            //翻转单词
            reverse(strArr,start,i-1);
            start = i + 1;
        }
    }

    return strArr.join('');
};

function removerExtraSpace(strArr) {
    let fast = 0;
    let slow = 0;
    while(fast<strArr.length) {
        if(strArr[fast] === ' ' && ( fast===0 || strArr[fast-1]===' ')) {
            fast++;
        }else{
            strArr[slow++] = strArr[fast++];
        }
    }
        strArr.length = strArr[slow-1] === ' ' ? slow - 1 : slow;

}
function reverse(strArr,start,end) {
    let l = start;
    let r = end;
    while(l<r) {
        [strArr[l],strArr[r]] = [strArr[r],strArr[l]];
        l++;
        r--;
    }
}

API版本

JavaScript提供了很多关于字符串和数组使用的api,大幅度的提高了我们写代码的效率。这里主要使用的split、filter、reserve和join。几行代码就可以解决我们的问题,思路清晰明了通俗易懂,不累赘。

var reverseWords = function(s) {
	return s.split(' ').filter(item => item).reverse().join(' ')
};

注意:虽然api版本的代码少的夸张,但是其实整体的实现思路其实和上面手撸版本是一样的,依旧是先字符串转数组,再去除空格,再对单词反转,最后转回字符串。整体来说,各有好处,具体看什么场景,怎么去使用。


感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。

写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤