Leetcode 151. 翻转字符串里的单词
描述
给定一个字符串,逐个翻转字符串中的每个单词。
示例 1:
输入: "the sky is blue"
输出: "blue is sky the"
示例 2:
输入: " hello world! "
输出: "world! hello"
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
示例 3:
输入: "a good example"
输出: "example good a"
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
链接
151. 翻转字符串里的单词 - 力扣(LeetCode) (leetcode-cn.com)
代码
解法一:直接使用API
1 class Solution { 2 public String reverseWords(String s) { 3 // 除去开头和末尾的空白字符 4 s = s.trim(); 5 // 正则匹配连续的空白字符作为分隔符分割 6 List<String> wordList = Arrays.asList(s.split("\\s+")); 7 Collections.reverse(wordList); 8 return String.join(" ", wordList); 9 } 10 }
解法二:使用双指针
1、用 s.trim() 去除空格
2、用 split()方法,删除空格,分为 字符串数组
Java split() 方法 | 菜鸟教程 (runoob.com)
class Solution { public String reverseWords(String s) { s = s.trim(); //去掉首尾空格; StringBuilder res = new StringBuilder(); int len = s.length(); int i = len - 1, j = i; //从尾开始 往 前遍历,i指向句中单词的开头,j指向尾 while (i >= 0) { while (i >= 0 && s.charAt(i) != ' ') { // 寻找空格 i--; } res.append(s.substring(i+1, j+1) + ' '); //前开后闭;添加单词 和 空格 while (i >= 0 && s.charAt(i) == ' ') { //跳过空格; i--; } j = i; } return res.toString().trim(); } }
解法三:自己编写 去除 空格函数
1 class Solution { 2 /** 3 * 不使用Java内置方法实现 4 * <p> 5 * 1.去除首尾以及中间多余空格 6 * 2.反转整个字符串 7 * 3.反转各个单词 8 */ 9 public String reverseWords(String s) { 10 // System.out.println("ReverseWords.reverseWords2() called with: s = [" + s + "]"); 11 // 1.去除首尾以及中间多余空格 12 StringBuilder sb = removeSpace(s); 13 // 2.反转整个字符串 14 reverseString(sb, 0, sb.length() - 1); 15 // 3.反转各个单词 16 reverseEachWord(sb); 17 return sb.toString(); 18 } 19 20 private StringBuilder removeSpace(String s) { 21 // System.out.println("ReverseWords.removeSpace() called with: s = [" + s + "]"); 22 int start = 0; 23 int end = s.length() - 1; 24 while (s.charAt(start) == ' ') start++; 25 while (s.charAt(end) == ' ') end--; 26 StringBuilder sb = new StringBuilder(); 27 while (start <= end) { 28 char c = s.charAt(start); 29 if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') { 30 sb.append(c); 31 } 32 start++; 33 } 34 // System.out.println("ReverseWords.removeSpace returned: sb = [" + sb + "]"); 35 return sb; 36 } 37 38 /** 39 * 反转字符串指定区间[start, end]的字符 40 */ 41 public void reverseString(StringBuilder sb, int start, int end) { 42 // System.out.println("ReverseWords.reverseString() called with: sb = [" + sb + "], start = [" + start + "], end = [" + end + "]"); 43 while (start < end) { 44 char temp = sb.charAt(start); 45 sb.setCharAt(start, sb.charAt(end)); 46 sb.setCharAt(end, temp); 47 start++; 48 end--; 49 } 50 // System.out.println("ReverseWords.reverseString returned: sb = [" + sb + "]"); 51 } 52 53 private void reverseEachWord(StringBuilder sb) { 54 int start = 0; 55 int end = 1; 56 int n = sb.length(); 57 while (start < n) { 58 while (end < n && sb.charAt(end) != ' ') { 59 end++; 60 } 61 reverseString(sb, start, end - 1); 62 start = end + 1; 63 end = start + 1; 64 } 65 } 66 }