L1-翻转字符串

题目
给定一个字符串,逐个翻转字符串中的每个单词。

说明
单词的构成:无空格字母构成一个单词
输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个

样例
给出s = “the sky is blue”,返回“blue is sky the”

法一

先直接用split函数将单词分割出来,然后存到list里,最后取出来依次添加并加上空格就行了。记得在末尾去掉最后的空格。
split函数是字符串处理中很重要的一个函数,需要熟练掌握

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
public class Solution {
/**
* @param matrix
* : matrix, a list of lists of integers
* @param target
* : An integer
* @return: a boolean, indicate whether matrix contains target
*/
public static String reverseWords(String s)
{
if(s==null||s.length()==0)//字符串为空
return "";
String[] array=s.split(" ");
StringBuilder sb=new StringBuilder();
for(int i=array.length-1;i>=0;i--)
{
if(!array[i].equals(""))
sb.append(array[i]).append(" ");
}
return sb.length()==0?"":sb.substring(0,sb.length()-1);//判断" "返回也为""



}
public static void main(String[] args) {
String s1=reverseWords(" the sky is blue");
System.out.println(s1);
}
}

法二

基本思路:
1)第一趟遍历
将每个单词翻转,且去掉连续空格中多余的空格(两端空格早已去掉)。
2)第二趟遍历
将整个字符串完全翻转。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package a;

public class Solution {
/**
* @param matrix
* : matrix, a list of lists of integers
* @param target
* : An integer
* @return: a boolean, indicate whether matrix contains target
*/
public static String reverseWords(String s) {
StringBuilder sb = new StringBuilder(s.trim());
for (int i = 0; i < sb.length(); i++)
if (sb.charAt(i) == ' ') {
while (sb.charAt(i) == sb.charAt(i + 1))
sb.deleteCharAt(i + 1);
}
for (int i = 0; i < sb.length();) {

if (sb.charAt(i) != ' ') {//单词,将单词翻转
int j = i;
while (j + 1 < sb.length() && sb.charAt(j + 1) != ' ')
j++;
for (int k = 0; k < (j - i + 1) / 2; k++) {
char c = sb.charAt(k + i);
sb.setCharAt(k + i, sb.charAt(j - k));
sb.setCharAt(j - k, c);
}
i = j + 1;
}
// if(sb.charAt(i)==' ') i++;
// 不能写成上面的判断 原因 如果判断到最后一个字母 它会访问下一个加以判断 而不是结束循环 超出数组范围
else
i++;
}
// eht yks si eulb
for (int i = 0; i < sb.length() / 2; i++) {// 从两端开始,前后互换
char c = sb.charAt(i);
sb.setCharAt(i, sb.charAt(sb.length() - 1 - i));
sb.setCharAt(sb.length() - 1 - i, c);
}
return sb.toString();

}

public static void main(String[] args) {
String s1 = reverseWords(" the sky is blue");
System.out.println(s1);
}
}