算法学习第十一天

143 阅读1分钟

  今天做leetcode的第557题-反转字符串中的单词 |||。按照惯例,先上题目:

给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例:
输入:"Let's take LeetCode contest"
输出:"s'teL ekat edoCteeL tsetnoc"

  题目已经把要求表达的很清楚了。那么就直接开始做题,大概思路就是先按照空格把字符串给分割成一个数组,然后再对数组内的字符串进行反转。上代码:

var reverseWords = function(s) {
    const arr = s.split(' ')
    for (let i = 0; i < arr.length; i++) {
        arr[i] = helper(arr[i])
    }
    return arr.join(' ')
};
function helper (str) {
    let s = ''
    for (let i = str.length - 1; i >= 0; i--) {
        s += str[i]
    }
    return s
}

  这道题做起来,思路还是挺清晰的。不过还可以换一种写法来解决,利用ES6的语法。

var reverseWords = function(s) {
    return s.split(' ').map(item=>{
        return Array.from(item).reverse().join('')
    }).join(' ')
};

  这种写法就比较简洁一点,只有三行代码。不过大致思路是一样的,都是先拆分成数组,再对数组内的字符串进行反转,然后再拼接起来。
  还有第三种解法,只需要一层for循环就可以了。

var reverseWords = function(s) {
    let longRes = ''
    let shortRes = ''
    for (let i = 0; i < s.length; i++) {
        if (s[i] !== ' ') {
            shortRes = s[i] + shortRes
        } else {
            longRes = longRes ? longRes + ' ' + shortRes : shortRes
            shortRes = ''
        }
        if (i == s.length - 1) {
            longRes = longRes ? longRes + ' ' + shortRes : shortRes
        }
    }
    return longRes
};

  大概思路就是用两个变量来存储字符串,longRes存储整体结果,shortRes存储单词的反转结果。最后输出longRes即可。
  今天内容就到这,虽然题目比较简单,但可以尝试从多个方向去解答。