乐趣区

关于leetcode:力扣之反转字符串中的单词-III

题目形容

给定一个字符串 s,你须要反转字符串中每个单词的字符程序,同时仍保留空格和单词的初始程序。

示例 1:

输出:s = "Let's take LeetCode contest"输入:"s'teL ekat edoCteeL tsetnoc"

示例 2:

输出:s = "God Ding"
输入:"doG gniD"

力扣原题目地址:https://leetcode.cn/problems/…

思路剖析

解法一 字符串转数组反转再转字符串

这种形式可读性能够,即先把字符串以空格为宰割转换成数组,而后 map 循环把数组中的每一项(字符串),再转成一个个的小数组反转再转回来即可。代码如下:

let s = "abc fgg kks"
var reverseWords = function (s) {let arr = s.split('') // 此时 arr 为:['abc','fgg','kks']
    arr = arr.map((item) => {return item.split('').reverse().join('') // 把每一项字符串转成数组,在反转颠倒,再转回字符串
    }) // map 循环加工当前的 arr 为:['cba', 'ggf', 'skk']
    return arr.join('') // 最终变成:'cba ggf skk'
};

解法二 顺叙遍历分堆数组头部追加

思路:

比方:let s = "abc fgg kks",当咱们顺叙遍历的时候,就会失去'k','k','s','','g','g','f',' ','c','b','a',此时咱们发现,反转确实是反转了,不过地位也反转了。

于是乎,咱们有这样一个思路:分堆数组头部追加,这个案例,咱们以空格为界线把字符串分为三堆,别离是:abc一堆、fgg一堆、kks一堆。当咱们顺叙遍历的时候,就会拿到反转的三堆 skkggfabc,拿到一堆,就把这一堆给头部追加unshift 到数组中去,这样的话,每一堆的程序还是不变的。而后再转成字符串即可。代码如下:

let s = "abc fgg kks"
var reverseWords = function (ss) {
    // 1. 因为是以空格为辨别,见到空格阐明这一堆字符串结束,才会装填到数组中去,所以这里手动再在原有字符串头部增加一个空格,用于辨别一堆一堆的完结
    let s = ' ' + ss
    let arr = [] // 2. 创立一个数组用于装填一堆一堆的字符串
    let tempStr = ''// 3. 因为遍历失去的是一个一个的字符串,所以再创立一个空字符串用于拼接' 堆 '
    for (let i = s.length - 1; i >= 0; i--) {
        // 4. 顺叙第一个必定不是空格的,所以看 else 语句中的代码
        if (s[i] === ' ') { // 5. 当遇到空格的时候,阐明这一堆完结啦,一堆完结,那就一堆装填呗
            arr.unshift(tempStr)  // 6. 把这一堆数据头部追加到数组中,这样地位就不会变动咯
            arr.unshift(' ') // 7. 留神这里须要手动再头部追加一个空格,因为原来的字符串也有空格哦,空格不能漏掉哦
            tempStr = '' // 8. 而后把用于拼接堆的字符串重置,以便持续从新拼接堆
        } else {tempStr = tempStr + s[i] // 5.1 拼接归拢一堆,留神因为是反转,所以是 tempStr + s[i]拼接,不要写反了哦
        }
    }
    console.log('数组', arr); // 9. 打印看看 ['cba', 'ggf', 'skk']
    return arr.join('').trimStart() // 10. 转成字符串当前,别忘了把左侧的空格给去掉哦};
console.log(reverseWords(s)  );

解法三 顺叙遍历分堆字符串头部追加

这个和上方相似,就是把一堆一堆的字符串应用字符串头部拼接(原来是应用数组头部追加,再转字符串),代码如下:

var reverseWords = function (ss) {
    let s = ' ' + ss // 1. 加空格做辨别一堆一堆的字符串
    let resultStr = '' // 2. 后果字符串
    let tempStr = '' // 3. 拼接堆字符串
    for (let i = s.length - 1; i >= 0; i--) {if (s[i] === ' ') { // 4. 顺叙第一个必定不是空格
            resultStr = ' ' + tempStr + resultStr // 6. 把拼接好的一堆字符串加到后果字符串上
            tempStr = '' // 7. 而后把拼接字符串重置为原来的状态
        } else {tempStr = tempStr + s[i] // 5. 一堆字符串拼接
        }
    }
    return resultStr.trimStart() // 8. 返回后果的时候,也要留神去除左侧之前手动增加的空格哦};

好忘性不如烂笔头,记录一下吧 ^_^

退出移动版