|
| 1 | +##### 题目 |
| 2 | +``` |
| 3 | +给定一个字符串,逐个翻转字符串中的每个单词。 |
| 4 | +
|
| 5 | +示例: |
| 6 | +
|
| 7 | +输入: "the sky is blue", |
| 8 | +输出: "blue is sky the". |
| 9 | +
|
| 10 | +说明: |
| 11 | +
|
| 12 | + 无空格字符构成一个单词。 |
| 13 | + 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 |
| 14 | + 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。 |
| 15 | +
|
| 16 | +进阶: 请选用C语言的用户尝试使用 O(1) 空间复杂度的原地解法。 |
| 17 | +``` |
| 18 | +##### 思路 |
| 19 | +- 先将整个字符串反转 |
| 20 | +- 按照空格分成String数组 |
| 21 | +- 每个单词反转 |
| 22 | +##### 代码 |
| 23 | + |
| 24 | +``` |
| 25 | +public class Solution { |
| 26 | + public String reverseWords(String s) { |
| 27 | + int length=s.length(); |
| 28 | + //当字符串为空 |
| 29 | + if(s == null){ return null;} |
| 30 | + //当字符串为" "时 直接返回null |
| 31 | + if(s.trim().equals("")){ |
| 32 | + return s.trim(); |
| 33 | + } |
| 34 | +
|
| 35 | + //1.反转整个字符串 |
| 36 | + String allRevStr=ReverseWord(s); |
| 37 | + //2.获得每个单词 |
| 38 | + String[] strChar=allRevStr.split(" "); |
| 39 | +
|
| 40 | + //3.反转每个字符串 |
| 41 | + String reverse=""; |
| 42 | + for (int i=0; i<strChar.length; ++i) { |
| 43 | + String temp=ReverseWord(strChar[i]); |
| 44 | + if (temp.equals("")) { |
| 45 | + continue; |
| 46 | + } |
| 47 | + |
| 48 | + if (i==strChar.length-1) { |
| 49 | + reverse=reverse+temp; |
| 50 | + }else{ |
| 51 | + reverse=reverse+temp+" "; |
| 52 | + } |
| 53 | + } |
| 54 | + return reverse; |
| 55 | + } |
| 56 | +
|
| 57 | + String ReverseWord(String s){ |
| 58 | + //删除字符串前序和后继中的空格 |
| 59 | + String str=s.trim(); |
| 60 | + if (str.length()==1) { |
| 61 | + return str; |
| 62 | + }else if (str.equals("")) { |
| 63 | + return ""; |
| 64 | + }else{ |
| 65 | + StringBuilder sb=new StringBuilder(str); |
| 66 | + String revStr=sb.reverse().toString(); |
| 67 | + return revStr; |
| 68 | + } |
| 69 | + } |
| 70 | + |
| 71 | +} |
| 72 | +``` |
| 73 | + |
| 74 | +##### 改进方法 |
| 75 | + |
| 76 | +``` |
| 77 | +public class Solution { |
| 78 | + public String reverseWords(String s) { |
| 79 | + int length=s.length(); |
| 80 | + //当字符串为空 |
| 81 | + if(s == null){ return null;} |
| 82 | + //当字符串为" "时 直接返回null |
| 83 | + if(s.trim().equals("")){ |
| 84 | + return s.trim(); |
| 85 | + } |
| 86 | + /** |
| 87 | + * 先将字符串按照空格分裂为字符串数组 |
| 88 | + * 然后收尾两个指针来交换即可 |
| 89 | + */ |
| 90 | + //0.掐头去尾 |
| 91 | + String allRevStr=s.trim(); |
| 92 | + //1.将字符串按照空格分裂为字符串数组 |
| 93 | + String[] strChar=allRevStr.split(" "); |
| 94 | +
|
| 95 | + //2.使用首尾两个指针来交换 |
| 96 | + int left=0; |
| 97 | + int right=strChar.length-1; |
| 98 | + String temStr=null; |
| 99 | + while(left<right){ |
| 100 | + //交换 |
| 101 | + temStr=strChar[left]; |
| 102 | + strChar[left]=strChar[right]; |
| 103 | + strChar[right]=temStr; |
| 104 | + //移动指针 |
| 105 | + left++; |
| 106 | + right--; |
| 107 | + } |
| 108 | + //3.拼接好新的字符串 |
| 109 | + String reverse=""; |
| 110 | + for (int i=0; i<strChar.length; ++i) { |
| 111 | + //对每一个单词掐头去尾 |
| 112 | + String temp=strChar[i].trim(); |
| 113 | + |
| 114 | + if (temp.equals("")) { |
| 115 | + continue; |
| 116 | + } |
| 117 | +
|
| 118 | + if (i==strChar.length-1) { |
| 119 | + reverse=reverse+temp; |
| 120 | + }else{ |
| 121 | + reverse=reverse+temp+" "; |
| 122 | + } |
| 123 | + } |
| 124 | + return reverse; |
| 125 | + } |
| 126 | +} |
| 127 | +``` |
0 commit comments