Leetcode:151.翻转字符串里的单词

253 阅读1分钟

力扣题目链接

题意:

给你一个字符串 s ,逐个翻转字符串中的所有 单词 。

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

请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。

说明:

输入字符串 s 可以在前面、后面或者单词间包含多余的空格。 翻转后单词间应当仅用一个空格分隔。 翻转后的字符串中不应包含额外的空格。  

image.png

思路:

  • 首先将字符串里的多余空格删除,一个是首尾的空格,还有一个是单词间多余的空格。移除空格这一步和之前数组题目的“移除元素”那一题是一样的。末尾空格的删除是设定数组的长度。
  • 其次反转整个字符串
  • 最后反转每个单词的字符串,每个单词的分界就是空格,找准边界即可
/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    const strArr = Array.from(s)
    removeExtraSpace(strArr)
    reverseStr(strArr,0,strArr.length-1)
    let start = 0
    for(let i =0;i<=strArr.length;i++){
        if(strArr[i]===' '||i ===strArr.length){
            reverseStr(strArr,start,i-1)
            start = i+1
        }
    } 
    return strArr.join('')

};

var removeExtraSpace = function(strArr){
    let slowIndex = 0
    let fastIndex = 0
    //删除数组开头和单词间多余的空格
    while(fastIndex<strArr.length){
        if(strArr[fastIndex]===' '&&(fastIndex===0 || strArr[fastIndex-1]===' ')){
            fastIndex++
        }else{
            strArr[slowIndex++]=strArr[fastIndex++]
        }
    }
    //删除数组末尾的空格
    strArr.length = strArr[slowIndex-1]===' '?slowIndex-1:slowIndex
}

var reverseStr = function(strArr,start,end){
    let left = start
    let right = end
    while(left<right){
        [strArr[right],strArr[left]] = [strArr[left],strArr[right]]
        left++
        right--
    }
}