【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
(连接)
-
使用
split
将字符串按空格分割成字符串数组; -
使用
reverse
将字符串数组进行反转; -
使用
join
方法将字符串数组拼成一个字符串。
详解:
- 使用String.
split
将字符串按空格分割成字符串数组;- 使用split方法时传入的参数为正则表达式,关于正则表达式的内容自行百度,此处不做赘述
- 当以空格作为分隔符的时候,分两种情况,具体区别看下面代码的例子
- split(" ")——以空格为分割符完成字符串分割后,若两单词间有 x>1 个空格,则在输出的单词列表String[]中,此两单词间会多出 x - 1 个 “空单词” (空单词即 " " )。
- split("\\s+")——使用的是正则表达式,将连续或者单个的空字符视为“分隔符”,不会出现split(" ")的情况
- 当以空格作为分隔符的时候,若需要将多个连续的空格也视为分隔符,则建议采用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!]
- 使用 Collections.
reverse
将字符串数组(准确地说应该是字符串列表)进行反转;- Java Collections reverse()——集合反转——reverse() 用于反转指定列表List中元素的顺序。
- 语法:
public static void reverse(List<?> list) 【
注意,使用该reverser方法的方式是传参,接受的是一个List<?>列表参数
】 - 参考:http://www.yiidian.com/java-collection/java-collections-reverse-method.html
- 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]
- 除了Collections类的reverse()方法,还有别类也有reverse方法
- 别的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
- 别的reverse举例:StringBuffer、StringBuilder.reverse()的效果如下代码所示
- 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
- 使用
join
方法将字符串数组拼成一个字符串。- 一、String.join()
- 1.String.join()是JDK8新增方法(无需引包)
- 2.需要2个参数,第一个参数为拼接符号,第二个参数为数组或者集合
-
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
- 3.参考:https://blog.csdn.net/lyylkj12/article/details/46709883
- 二、拓展——StringJoiner
- 1.StringJoiner是Java8新出的一个类,用于构造由分隔符分隔的字符序列,并可选择性地以提供的前缀开始和以提供的后缀结尾。省的我们开发人员再次通过StringBuffer或者StingBuilder拼接。
- 2.实际上是运用了StringBuilder的一个拼接字符串的封装处理
我们查看一下一下代码,试着猜一下。 -
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() - 1.与String.join类似,具体参考https://blog.csdn.net/YuanMxy/article/details/81012697
- 一、String.join()
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——
接受一个数组作为参数,并返回一个ListArrays.asList
3.Arrays.asList
具体参考:https://www.jianshu.com/p/2b113f487e5e