zoukankan      html  css  js  c++  java
  • 字符串算法 反转单词原理讲解

    题目:给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序
    输入: '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 之间的 ' 。这个是单转元素的一个集合,所以这是一个加号
  • 相关阅读:
    Android开发之修改Manifest中meta-data的数据
    Android开发之StrictMode
    Cookie默认不设置path时,哪些请求会携带cookie数据
    Servlet中的请求转发
    AndroidCamera开发学习笔记01
    AsyncTask源码解读
    Android Studio自定义签名文件
    Kotlin:Android世界的Swift
    C# 传值给C++
    .NET CLR 运行原理
  • 原文地址:https://www.cnblogs.com/wzndkj/p/11903912.html
Copyright © 2011-2022 走看看