【leetcode刷题】剑指 Offer 58 - I. 翻转单词顺序

题目描述:

输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。

示例 1:
输入: "the sky is blue"
输出: "blue is sky the"

示例 2:
输入: "  hello world!  "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: "a good   example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

说明:

    无空格字符构成一个单词。
    输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

注意:本题与主站 151 题相同:https://leetcode-cn.com/problems/reverse-words-in-a-string/
注意:此题对比原题有改动

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解链接(包含2个网址):

151题:https://leetcode-cn.com/problems/reverse-words-in-a-string/

本题:https://leetcode-cn.com/problems/fan-zhuan-dan-ci-shun-xu-lcof/solution/mian-shi-ti-58-i-fan-zhuan-dan-ci-shun-xu-shuang-z/


 

 

注意:本博客非题解,而是在看了Leetcode官网上的题解之后,总结、抽取出相对自己而言“新”的知识点。

 

 


 

 

1.巧妙运用 java语言 提供的内置API方法——split(拆分),reverse(翻转)和 join(连接)

 

  1. 使用 split 将字符串按空格分割成字符串数组;
  2. 使用 reverse 将字符串数组进行反转;
  3. 使用 join 方法将字符串数组拼成一个字符串。

 

 


 

详解:

  1. 使用String. split 将字符串按空格分割成字符串数组;
    1. 使用split方法时传入的参数为正则表达式,关于正则表达式的内容自行百度,此处不做赘述
    2. 当以空格作为分隔符的时候,分两种情况,具体区别看下面代码的例子
    3. split(" ")——以空格为分割符完成字符串分割后,若两单词间有 x>1  个空格,则在输出的单词列表String[]中,此两单词间会多出  x - 1  个 “空单词” (空单词即 " " )。 
    4. split("\\s+")——使用的是正则表达式,将连续或者单个的空字符视为“分隔符”,不会出现split(" ")的情况
    5. 当以空格作为分隔符的时候,若需要将多个连续的空格也视为分隔符,则建议采用split("\\s+")而不是split(" ")
    public class Main {
    
            public static void main(String[] args){
                    String s = "   leetcode is   good! ";
                    // 除去开头和末尾的空白字符
                    s = s.trim();
                    // 正则匹配连续的空白字符作为分隔符分割
                    List<String> wordList1 = Arrays.asList(s.split("\\s+"));
                    List<String> wordList2 = Arrays.asList(s.split(" "));
    
                    System.out.println(wordList1);
                    System.out.println(wordList2);
     
            }
    
    }
    
    //输出结果
    [leetcode, is, good!]
    [leetcode, is, , , good!]

     

  2. 使用 Collections.reverse 将字符串数组(准确地说应该是字符串列表)进行反转;
    1. Java Collections reverse()——集合反转——reverse() 用于反转指定列表List中元素的顺序
    2. 语法:public static void reverse(List<?> list)注意,使用该reverser方法的方式是传参,接受的是一个List<?>列表参数
    3. 参考:http://www.yiidian.com/java-collection/java-collections-reverse-method.html
    4. Collection.reverse()效果如下
      package com.yiidian;
      
      import java.util.*;
      
      public class Demo {
      
          public static void main(String[] args) {
              //Create a list of strings
              List<String>  mylist = new ArrayList<String>();
              mylist.add("Java");
              mylist.add("PHP");
              mylist.add("Python");
              mylist.add("COBOL");
              System.out.println("Original List:- " + mylist);
              Collections.reverse(mylist);
              System.out.println("Modified List:- " + mylist);
          }
      }
      
      //结果显示:
      
      Original List:- [Java, PHP, Python, COBOL]
      Modified List:- [COBOL, Python, PHP, Java]

       

    5. 除了Collections类的reverse()方法,还有别类也有reverse方法
    6. 别的reverse可以参考网址    https://www.yiibai.com/search?kw=java+reverse%28%29     或者   http://www.yiidian.com/index.php?m=search&c=index&a=init&typeid=1&siteid=1&q=reverse
    7. 别的reverse举例:StringBuffer、StringBuilder.reverse()的效果如下代码所示
    8. StringBuffer、StringBuilder.reverse()的语法:public StringBuffer reverse()     public StringBuilder reverse()   【无形参,直接buff.reverse()或者builder.reverse()使用】
      package com.leetcode;
      
      public class Main {
      
              public static void main(String[] args){
                      StringBuffer buff = new StringBuffer("tutorials yiibai");
                      System.out.println("buffer = " + buff);
                      System.out.println("reverse = " + buff.reverse());
      
      
                      buff = new StringBuffer("malyalam");
                      System.out.println("buffer = " + buff);
                      System.out.println("reverse = " + buff.reverse());
      
      
                      StringBuilder builder = new StringBuilder("india lxq");
                      System.out.println("builder = " + builder)
                      System.out.println("reverse = " + builder.reverse());
      
      
                      builder = new StringBuilder("malayalam lxq");
                      System.out.println("builder = " + builder);
                      System.out.println("reverse = " + builder.reverse());
      
              }
      
      }
      //结果显示
      //buffer、builder表示原字符序列
      //reverse表示反转后的序列
      buffer = tutorials yiibai
      reverse = iabiiy slairotut
      buffer = malyalam
      reverse = malaylam
      builder = india lxq
      reverse = qxl aidni
      builder = malayalam lxq
      reverse = qxl malayalam

       

  3. 使用 join 方法将字符串数组拼成一个字符串。
    1. 一、String.join() 
      1. 1.String.join()是JDK8新增方法(无需引包)
      2. 2.需要2个参数,第一个参数为拼接符号,第二个参数为数组或者集合
      3.  

         3.代码示例

        List<String> list = new ArrayList<>();
        list.add("Mxy");
        list.add("String");
        list.add("join");
        String join = String.join("-",list);//传入String类型的List集合,使用"-"号拼接
        System.out.println(join);
                
        String[] s = new String[]{"Yuan","Mxy"};//传入String类型的数组,使用"-"号拼接
        String join2 = String.join("-",s);
        System.out.println(join2);
        
        //结果如下:
        Mxy-StringUtils-join
        Yuan-Mxy

         

      4. 3.参考:https://blog.csdn.net/lyylkj12/article/details/46709883
    2. 二、拓展——StringJoiner
    3. 1.StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地以提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。
    4. 2.实际上是运用了StringBuilder的一个拼接字符串的封装处理
      我们查看一下一下代码,试着猜一下。
    5. StringJoiner sj = new StringJoiner(":", "[", "]");
      sj.add("George").add("Sally").add("Fred");
      String desiredString = sj.toString();
      代码输出为[George:Sally:Fred]

      3.参考:https://blog.csdn.net/diehuang3426/article/details/82229625

      三、StringUtils.join()
    6. 1.与String.join类似,具体参考https://blog.csdn.net/YuanMxy/article/details/81012697

 

 

2.利用Deque——双端队列方法。由于双端队列支持从队列头部插入的方法,因此我们可以沿着字符串一个一个单词处理,然后将单词压入队列的头部,再将队列转成字符串即可。即,将Deque作为栈使用(后进先出,LIFO)

 


 

  一、概念

  Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素

  因此Deque既可以支持LIFO形式也可以支持LIFO形式.

  Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者.

  二、主要方法:

 

 

 

 

  更多Deque方法参考:https://www.cnblogs.com/bushi/p/6681543.html


 3.将String字符串转化为单词列表——Arrays.asList(s.split("\\s+")

  1.split方法——把字符串String转化为字符串数组String[]——String调用split方法后返回一个String[]

  2.Arrays.asList方法——把数组转化为List——Arrays.asList接受一个数组作为参数,并返回一个List

  3.Arrays.asList具体参考:https://www.jianshu.com/p/2b113f487e5e

 

posted @ 2021-02-01 16:56  Lucy_LinXiaoQing  阅读(101)  评论(0编辑  收藏  举报