题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路一
public class Solution {
public String ReverseSentence(String str) {
if(str == null ||str.trim().equals("")) return str;//需考虑到空格
String[] arr = str.split(" ");
int len = arr.length;
StringBuffer sb = new StringBuffer();//这里不能初始化为null,否则下面的append方法会报错
for(int i = len - 1;i >= 0; i--){
sb.append(arr[i]+" ");//每个单词之间需要有空格
}
sb.deleteCharAt(sb.length() - 1);//删除最后一个空格
String newStr = sb.toString();
return newStr;
}
}
思路二
先翻转整个句子,然后再翻转每个单词
public class Reverse {
public String ReverseSentence(String str) {
char[] chars = str.toCharArray();
//整体翻转
reverse(chars,0,chars.length - 1);
//标注空格的位置
int blank = -1;
for(int i = 0;i < chars.length;i++){
if(chars[i] == ' '){
//标注下一个空格的位置
int nextBlank = i;
//对每个单词进行翻转
reverse(chars,blank + 1,nextBlank - 1);
blank = nextBlank;
}
}
//遍历完最后一个单词没有‘ ’所以需要单独进行翻转
reverse(chars,blank + 1,chars.length - 1);//最后一个单词单独进行反转
return new String(chars);//将char数组转为字符串类型
}
public void reverse(char[] chars,int low,int high){
while(low < high){
char temp = chars[low];
chars[low] = chars[high];
chars[high] = temp;
low++;
high--;
}
}
}
看一个c语言版的更加能体会其中的奥妙
char* ReverseSentence(char *pData)
{
if(pData == nullptr)
return nullptr;
char *pBegin = pData;
char *pEnd = pData;
//将end指针移动到末尾处
while(*pEnd != ' ') pEnd ++;
pEnd--;
// 翻转整个句子
Reverse(pBegin, pEnd);
// 翻转句子中的每个单词
pBegin = pEnd = pData;
while(*pBegin != ' ')
{
//如果翻转完一个单词,就将开始和结束的指针移向下一个单词
if(*pBegin == ' '){
pBegin ++;
pEnd ++;
}else if(*pEnd == ' ' || *pEnd == ' '){
//开始进行单词翻转
Reverse(pBegin, --pEnd);
//翻转之后移动两个指针到下一个单词的位置
pBegin = ++pEnd;
}else{
//将末尾指针移动到每个单词的末尾处
pEnd ++;
}
}
return pData;
}