题目描述
给定一个字符串,逐个翻转字符串中的每个单词。例如“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()