Skip to content

翻转字符串中的单词

js
// 给定一个字符串,逐个翻转字符串中的每个单词。
//
// 示例 1:
// 输入: "the sky is blue"
// 输出: "blue is sky the"
//
// 示例 2:
// 输入: "  hello world!  "
// 输出: "world! hello"
// 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
//
// 示例 3:
// 输入: "a good   example"
// 输出: "example good a"
// 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

function fn(s){
    const arr = Array.from(s);
    // 删除多余空格
    removeSpaces(arr);
    // 整体翻转
    reverse(arr,-1,arr.length);

    // 翻转单个单词
    let l = -1;
    for(let i=0;i<=arr.length;i++){
        if(arr[i] === ' ' || i === arr.length){
            reverse(arr,l,i)
            l = i;
        }
    }

    return arr.join('');
}

function removeSpaces(arr){
    let l=0,r=0;
    while (r < arr.length){
        // 删除头部或单词之间多余空格
        // r===0 第一个为空格   arr[r - 1] === ' ':如果前一个不为空格,跳过,因为单词之间需要保留一个空格
        if(arr[r] === ' ' && (r === 0 || arr[r - 1] === ' ')){
            r ++;
        }else{
            arr[l++] = arr[r++];
        }
    }
    // 删除末尾多余空格
    arr.length = arr[l - 1] === ' ' ? l - 1 : l;
}

function reverse(arr,start,end){
    while (++start < --end){
        [arr[start],arr[end]] = [arr[end],arr[start]];
    }
}


// console.log(fn("a good   example"))
console.log(fn("  hello world!  "))
// 给定一个字符串,逐个翻转字符串中的每个单词。
//
// 示例 1:
// 输入: "the sky is blue"
// 输出: "blue is sky the"
//
// 示例 2:
// 输入: "  hello world!  "
// 输出: "world! hello"
// 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
//
// 示例 3:
// 输入: "a good   example"
// 输出: "example good a"
// 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

function fn(s){
    const arr = Array.from(s);
    // 删除多余空格
    removeSpaces(arr);
    // 整体翻转
    reverse(arr,-1,arr.length);

    // 翻转单个单词
    let l = -1;
    for(let i=0;i<=arr.length;i++){
        if(arr[i] === ' ' || i === arr.length){
            reverse(arr,l,i)
            l = i;
        }
    }

    return arr.join('');
}

function removeSpaces(arr){
    let l=0,r=0;
    while (r < arr.length){
        // 删除头部或单词之间多余空格
        // r===0 第一个为空格   arr[r - 1] === ' ':如果前一个不为空格,跳过,因为单词之间需要保留一个空格
        if(arr[r] === ' ' && (r === 0 || arr[r - 1] === ' ')){
            r ++;
        }else{
            arr[l++] = arr[r++];
        }
    }
    // 删除末尾多余空格
    arr.length = arr[l - 1] === ' ' ? l - 1 : l;
}

function reverse(arr,start,end){
    while (++start < --end){
        [arr[start],arr[end]] = [arr[end],arr[start]];
    }
}


// console.log(fn("a good   example"))
console.log(fn("  hello world!  "))