一、题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字的顺序不变。为简单起见,标点符号和普通字母一样处理。
举例说明
例如输入字符串”I am a student. ”,则输出”student. a am I”。
二、解题思路
第一步翻转句子中所有的字符。比如翻转“I am a student. ”中所有的字符得到”.tneduts a m a I”,此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。第二步再翻转每个单词中字符的顺序,就得到了”student. a am I”。这正是符合题目要求的输出。
public static char[] reverseSentence(char[] data) {
if (data == null || data.length < 1) {
return data;
}
reverse(data,0,data.length-1);
int start=0;
int end=0;
while(start<data.length) {
if(data[start]==' ') {
start++;
end++;
}else if(end==data.length||data[end]==' ') {
//顺序不能颠倒,因为end一开始就加1,所以是data.length为界限
reverse(data,start,end-1);
end++;
start=end;
}else {
end++;
}
}
return data;
}
public static void reverse(char[] data, int start, int end) {
if (data == null || data.length < 1 || end > data.length || start < 0 || start > end) {
return;
}
while (start < end) {
char temp = data[start];
data[start] = data[end];
data[end] = temp;
start++;
end--;
}
}
方法二:
递归实现:
public static String ReverSentence(String str) {
return (str.lastIndexOf(" ") == -1) ?
str :
str.substring(str.lastIndexOf(" ") + 1) + " " + ReverSentence(str.substring(0, str.lastIndexOf(" ")));
}
//输出student. a am I
方法三:
使用split函数,通过该函数判断字符串的空格
public String ReverseMethod2Fun(String str){
StringBuffer stringbuffer = new StringBuffer("");
if(str.length() <= 0 || str.trim().equals("")){
return str;
}
String[] strSet = str.split(" ");
int length = strSet.length;
for(int i = length - 1; i > 0;i--){
stringbuffer.append(strSet[i] + " ");
}
stringbuffer.append(strSet[0]); //单独加最后一个是不想最后多一个空格
return stringbuffer.toString();
}