前端算法-单词字符串反转

141 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第9天,点击查看活动详情

题目

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

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

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

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

思路一

我们使用js中的api实现一下,首先们将s参数使用trim方法先把前后的空格符裁剪,在使用split方法结合正则将中间空格符的字符串切割成单词,因为中间空格符可能是多个,所以我们用正则/ +/表示一个或多个空格符,然后使用数组中reverse方法将数组进行翻转,最后使用最后使用join方法将数组以空格的方式拼接成字符串返回出去

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    return s.trim().split(/ +/).reverse().join(' ');
};

思路二

我们先使用trim方法去掉两边的空格重新赋值给s参数,然后在声明res变量和cur变量,这两个变量默认为空字符串,然后再声明hasBlank变量作为空格标记,默认为false,接下来使用for循环进行倒序循环,在循环中使用cur变量来记录当前循环的单词,当循环中遇到空格时,我们就把cur变量加到res变量中,并且将hasBlank变量为true,为了防止出现多个空格的情况添加多个空格,当循环走到最后一个单词的时候,不会在循环中去进行空格拼接,所以我们在循环外去拼接最后一个空格

/**
 * @param {string} s
 * @return {string}
 */
var reverseWords = function(s) {
    s = s.trim();
    let res = '';
    let cur = '';
    let hasBlank = false;
    for(let i=s.length-1;i>=0;i--){
        if(s[i] !== ' ') {
            hasBlank = false;
            cur = s[i] + cur;
        } else {
           if(!hasBlank) {
               cur = cur + ' ';
               res = res+cur;
               cur='';
               hasBlank = true;
           }
        }
    }
    res = res+cur;
    return res;
};