字符串算法 反转单词原理讲解

题目:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序
输入: 'let's take leetcode contest'
输出: 's'tel ekat edocteel tsetnoc'
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。
在这个题目解析中,大家可能会觉得这个注意事项没什么用,其实有一定意义的。
解题思路:
1、搞清楚题意,这道题题意比较明白。同时仍保留空格和单词的初始顺序,也就是单词的顺序不能改变
2、我们要做的就是,如何保存单词的顺序不变,还要保证单词的反转
3、先把句子分隔开,分隔开之后把字符串变成一个数组。这样的话,数组的先后顺序就是单词的先后顺序
4、再把数组的每个单词进行反转
代码
export default (str) => {
    // 字符串按空格进行分隔,保存数组,数组的元素的险乎顺序就是单词的顺序
    let arr = str.split(' ')
    // 对数组进行遍历,然后每个元素进行反转
    let result = arr.map(item => {
      return item.split('').reverse().join('')
    })
    return result.join(' ')
}

最后会经常忘记空格join。这是注意事项的意义,能否完整周全的实现题目

但是这样写看上去很清晰,实际上写的有点冗余,还不够优雅。这样会减分的,怎么才会更加优雅一些呢
代码
export default (str) => {
    // 字符串按空格进行分隔,保存数组,数组的元素的险乎顺序就是单词的顺序
    // 对数组进行遍历,然后每个元素进行反转
    return str.split(' ').map(item => {
      return item.split('').reverse().join('')
    }).join(' ')
}

其实思路是一样的,只是代码的写法上不一样。优雅的地方是第一种多出了两个变量,第二种没有申明多余多变量

那么除了这种方法,可否还有别的方式实现
1、分隔字符串用正则, s 表示正则
export default (str) => {
    // 字符串按空格进行分隔,保存数组,数组的元素的险乎顺序就是单词的顺序
    // 对数组进行遍历,然后每个元素进行反转
    return str.split(/s/g).map(item => {
      return item.split('').reverse().join('')
    }).join(' ')
}
2、不用split方法
export default (str) => {
    // 字符串按空格进行分隔,保存数组,数组的元素的险乎顺序就是单词的顺序
    // 对数组进行遍历,然后每个元素进行反转
    return str.match(/[w']+/g).map(item => {
      return item.split('').reverse().join('')
    }).join(' ')
}
match 跟 split 不一样。 split 是说我做分隔。 match的意思是说我去识别,在这个题目中,应该是把所有的单词识别出来。因为正则的匹配是从左到右进行的。这个规则意味着我从左到右一个一个识别出来。识别出来的顺序就是单词的顺序。/[w']+/ 这个就是识别单词的意思。这个中括号表示可选项。这个 w 就是单词的意思。这个'就是 lets 之间的 ' 。这个是单转元素的一个集合,所以这是一个加号
原文地址:https://www.cnblogs.com/wzndkj/p/11903912.html