剑指OFFER----58-1、翻转单词顺序列(js实现)

题目

牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?


思路

  1. split API分割成数组
  2. 整个句子反转,再每个单词自己反转

// 暴力JS API
function ReverseSentence(str)
{
    // write code here
    // 缺点:面试肯定不会让你这样
    return str.split(' ').reverse().join(' ')
}
// 原生实现 reverse 来实现
function ReverseSentence(str)
{
    // write code here
    let lettersArr = str.split(' ')
    let i = 0
    let j = lettersArr.length - 1
    let swap = (arr, i, j) => {
        let temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
    }
    while (i < j) {
        swap(lettersArr, i, j)
        i++
        j--
    }
    return lettersArr.join(' ')
}
// 原生实现 split reverse 来实现
function ReverseSentence(str)
{
    // write code here
    let letterArr = []
    let letterStr = ''
    for (let i = 0; i < str.length; i++) {
        if (str[i] === ' ') {
            letterArr.push(letterStr)
            letterStr = ''
        } else {
            letterStr += str[i]
        }
    }
    if (letterStr !== '') {
        letterArr.push(letterStr)
    }
    let m = 0
    let n =  letterArr.length - 1
    let swap = (arr, i, j) => {
        let temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
    }
    while (m < n) {
        swap(letterArr, m, n)
        m++
        n--
    }
    return letterArr.join(' ')
}
// 原生实现 split reverse join来实现
function ReverseSentence(str)
{
    // write code here
    let letterArr = []
    let letterStr = ''
    for (let i = 0; i < str.length; i++) {
        if (str[i] === ' ') {
            letterArr.push(letterStr)
            letterStr = ''
        } else {
            letterStr += str[i]
        }
    }
    if (letterStr !== '') {
        letterArr.push(letterStr)
    }
    let m = 0
    let n =  letterArr.length - 1
    let swap = (arr, i, j) => {
        let temp = arr[i]
        arr[i] = arr[j]
        arr[j] = temp
    }
    while (m < n) {
        swap(letterArr, m, n)
        m++
        n--
    }
    let result = ''
    for (let k = 0; k < letterArr.length; k++) {
        result += letterArr[k]
        if (k !== letterArr.length - 1) {
            result += ' '
        }
    }
    return result
}
// 两次反转
function ReverseSentence(str)
{
    // write code here
    // 原生reverse
    let reverse = (arr, i, j) => {
        while (i < j) {
            let temp = arr[i]
            arr[i] = arr[j]
            arr[j] = temp
            i++
            j--
        }
    }
    // 分割字符数组
    let splitArr = []
    for (let i = 0; i < str.length; i++) {
        splitArr.push(str[i])
    }
    // 第一次整个句子整体反转
    reverse(splitArr, 0, splitArr.length - 1)
    // 第二次每个单词自己反转
    let start = 0
    for (let j = 0; j < splitArr.length; j++) {
        if (splitArr[j] === ' ') {
            reverse(splitArr, start, j-1)
            start = j+1
        }
    }
    if (start < splitArr.length - 1) {
        reverse(splitArr, start, splitArr.length - 1)
    }
    return splitArr.join('')
}

你可能感兴趣的:(剑指OFFER,剑指OFFER(JS版))