dcddc

西米大人的博客

0%

翻转字符串

题目描述

给定一个字符串,逐个翻转字符串中的每个单词。例如“how are you”,输出“you are how”
说明:

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

思路

首先需要把字符串前面的空格符去掉
然后遍历字符串,将遇到的每个单词add到一个字符串list里
最后倒序访问list,拼成字符串即可

唯一的难点:
如何判断已经读完了一个单词?
遇到空格就算读完了吗?那如果单词之间间隔了超过一个空格怎么办?

考虑用一个boolean变量,表示是否读完了一个单词。初始化为false。
当读到第一个空格时,设为true,将读到的单词add到list。
继续向下遍历每个字符,如果为空格,仍为true,表示读完了一个单词。
当读到字符非空时,将变量值为false,表示又要开始读单词了。如此反复即可。

代码

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
51
52
53
private StringBuilder stringBuilder;
private List<String> wordList;
public String reverseWords(String s) {
wordList = new ArrayList<>();
s = delBlankFromBegin(s);
boolean aWordFinish = false;
stringBuilder = new StringBuilder();
for(int i = 0; i < s.length(); i++) {
// 空格符的ASCII是32
if(s.charAt(i) != ' ') {
// 如果s最后一个字符不为空格,将最后一个单词添加到字符串中
if(i == s.length()-1) {
addWord(s, i+1);
break;
}

if(aWordFinish == true) {
aWordFinish = false;
}
}else {
if(aWordFinish == true) {
continue;
}
addWord(s, i);
aWordFinish = true;
}
}
for(int i = wordList.size()-1; i >=0; i--) {
stringBuilder.append(wordList.get(i));
}
return stringBuilder.toString();
}

private void addWord(String s, int i) {
StringBuilder local = new StringBuilder();
int tmp = i-1;
while(tmp >= 0 && s.charAt(tmp) != ' ') {
tmp--;
}
local.append(s.substring(tmp+1, i));
local.append(" ");
wordList.add(local.toString());
}

private String delBlankFromBegin(String s) {
for(int i = 0; i < s.length(); i++) {
if(s.charAt(i) != ' ') {
s = s.substring(i, s.length());
break;
}
}
return s;
}

考差点

  • 字符串处理
    void StringBuilder.append(String s)
    String StringBuilder.toString()