题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路分析
利用java的String语言特性,以空格为界切割句子得到数个单词,再从后往前,将单词拼接。因为单词内部的字母顺序是正确的,只是单词间的顺序翻转。
标准答案
不使用额外的辅助空间,先旋转每个单词,再旋转整个句子。相当于将单词内部顺序翻转两次,即恢复正常顺序,句子顺序翻转一次,即将原来逆序变为正序。
代码实现
/**
* 标准答案,不适用额外空间
* 先旋转每个单词,再旋转整个句子
*
* @param str
* @return
*/
public static String ReverseSentence(String str) {
if(str==null||str.equals("")){
return str;
}
int n = str.length();
char[] chars = str.toCharArray();
int i = 0, j = 0;
while (j <= n) {
if (j == n || chars[j] == ' ') {
//每次遇到空格及到末尾,就代表一个单词,旋转一次
reverse(chars, i, j - 1);
//更新i
i = j + 1;
}
//j往前走
j++;
}
//旋转整个句子
reverse(chars, 0, n - 1);
return String.valueOf(chars);
}
public static void reverse(char[] chars, int i, int j) {
while (i < j) {
swap(chars, i++, j--);
}
}
public static void swap(char[] chars, int i, int j) {
char tmp = chars[i];
chars[i] = chars[j];
chars[j] = tmp;
}
/**
* 使用java的语言特性
* 单词字母顺序正确,拼接字符串
*
* @param str
* @return
*/
public static String ReverseSentence2(String str) {
if (str == null || str.trim().equals("")) {
return str;
}
String[] strings = str.split(" ");
StringBuffer sb = new StringBuffer();
for (int i = strings.length - 1; i >= 0; i--) {
sb.append(strings[i]);
if (i > 0) {
sb.append(' ');
}
}
return sb.toString();
}