题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
![](https://img.haomeiwen.com/i16555752/1be3a2231aa46a1c.png)
题解一
按照空格切分字符串,这样每个单词就会存入到一个字符串数组中,然后再倒序拼接即可。
class Solution {
public String reverseWords(String s) {
// 使用正则表达式,去除多余的空格s
s = s.trim().replaceAll(" +", " ");
String[] strings = s.split(" ");
StringBuilder sb = new StringBuilder();
for (int i = strings.length - 1; i >= 0; i--) {
sb.append(strings[i]).append(" ");
}
return sb.deleteCharAt(sb.length()-1).toString();
}
}
题解二
但如果不允许使用JAVA的API的话,如果进行翻转呢?
我们可以通过两次翻转字符串来得到上面的结果。例如对于“student. a am I”,先翻转字符串内所有字符得到"I ma a .tneduts",再对每个单词中的字符顺序进行翻转,就得到了"I am a students."。
下面是参考代码:
class Solution {
public String reverseWords(String s) {
// 使用正则表达式,去除多余的空格s
s = s.trim().replaceAll(" +", " ");
// 先翻转整个字符串
char[] chars = s.toCharArray();
reverse(chars, 0, s.length()-1);
// 翻转字符串中的每个单词
int begin = 0, right = 0;
for (int i = 0; i < chars.length; i++) {
if (chars[i] == ' ') {
reverse(chars, begin, i-1);
begin = i + 1;
}
}
// 最后一个单词单独处理
reverse(chars, begin, chars.length-1);
// 字符数组转化为字符串
return String.valueOf(chars);
}
private void reverse(char[] chars, int left, int right) {
if (left > right)
return;
while (left < right) {
char temp = chars[left];
chars[left++] = chars[right];
chars[right--] = temp;
}
}
}
网友评论