菜鸟前端刷算法第八天

40 阅读1分钟

题目描述 - 反转字符串中的单词

给定一个字符串 s ,反转字符串中 单词 的顺序。

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

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

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

示例:

  • 输入: s = "the sky is blue",输出: blue is sky the
  • 输入: s = " hello world " ,输出: world hello
  • 输入: s = "a good   example",输出: example good a

思路分析

首先要去除首尾两端的空格, 对于字符串中间的空格也要进行判断。

  • 利用js语言自带的字符串、数组API,实现。 代码实现:
/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.split(' ').filter(item => item).reverse().join(' ');
};
  • 遍历字符串,逐个反转. 采用双指针,left指针初始在0号位置,right指针初始在s.length - 1位置,遍历字符串,将每个由空格分隔的字符串加入队列,最后再转回字符串。 代码实现:
/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    let left = 0, right = s.length-1;
    //word 暂存字符 直至拼成完整单词; qune 为结果数组
    let word = "", qune = [];
    // 去除左右两边空格
    while(s.charAt(left) === " ") left ++;
    while(s.charAt(right) === " ") right --;
    while(left <= right){
        let char = s[left];
        if(char=== " " && word){
            qune.unshift(word)
            word = ""
        }else if(char !== " "){
           // 拼接字符得到单词
            word += char 
        }
        left++
    }
    // 最后一个单词也要插入队列
    qune.unshift(word)
    return qune.join(" ")
};