力扣经典算法篇-17-反转字符串中的单词(逆序遍历,数组分割,正则表达式)
1、题干
给你一个字符串s ,请你反转字符串中单词的顺序。
单词是由非空格字符组成的字符串。s中使用至少一个空格将字符串中的单词分隔开。
返回单词顺序颠倒且单词之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = “the sky is blue”
输出:“blue is sky the”
示例 2:
输入:s = " hello world "
输出:“world hello”
解释:反转后的字符串中不能存在前导空格和尾随空格。
示例 3:
输入:s = “a good example”
输出:“example good a”
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。
提示:
1 <= s.length <= 104
s 包含英文大小写字母、数字和空格 ’ ’
s 中 至少存在一个 单词
2、解题
方法一:逆序遍历比较
字符串逆序遍历,当遇到非空格时,插入临时字符串的头部,遇到空格,结束临时字符串的拼接。
代码示例:
public static String reverseWords(String s) {StringBuilder result = new StringBuilder();s = s.trim();for (int i = s.length() - 1; i >= 0; i--) {StringBuilder tempWord = new StringBuilder();char c = s.charAt(i);while (c != ' ' && i >= 0) {tempWord.insert(0, c);if (i > 0) {i--;c = s.charAt(i);} else {break;}}if (tempWord.length() > 0) {result.append(tempWord).append(" ");}}return result.toString().trim();}
方法二:数组分割
使用空格进行数组分割,当如果是空字符串时跳过,手动添加空格。
代码示例:
public static String reverseWords(String s) {StringBuilder result = new StringBuilder();String[] s1 = s.trim().split(" ");for (int i = s1.length-1; i >=0; i--) {if (!"".equals(s1[i].trim())){result.append(s1[i]).append(" ");}}return result.toString().trim();}
方法三:正则表达式
使用正则表达式进行分割,\s可以表示1个或多个空格分隔,刚好分割后就不存在空字符串的数组。
代码示例:
public static String reverseWords(String s) {s= s.trim();// \\s 表示任意 空白字符 +表示出现1次获取多次List<String> wordList = Arrays.asList(s.split("\\s+"));Collections.reverse(wordList);return String.join(" ",wordList);}
向阳出发,Dare To Be!!!