题目:
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路:
(1)先翻转整个句子,即将句子转换成字符数组,将字符数组进行翻转。
(2)再对每个单词进行翻转,即判断字符数组下标对应的字符是否为空格来判断是否为一个单词。
对每个单词进行翻转的时候,用两个变量进行控制,start是单词开始的位置,end是单词后面的空格,每次翻转的字符区间在start~end-1之间
注意:最后一个单词是没有空格的,所以当判断字符不为空时,要先判断该单词是否是最后一个单词,即下标是否到数组的最后了。
代码:
- public String ReverseSentence(String str)
- {
- if(str == null ||str.length()<2)
- {
- return str;
- }
- char[] array = str.toCharArray();
- reserve(array,0,array.length-1);
- int start = 0;//记录每个单词的起始位置
- int end = 0;//单词的终止位置
- while(end < array.length)
- {
- if(array[end] !=' ')
- {
- if(end == array.length-1)//最后一个单词无空格
- {
- reserve(array,start,end);
- }
- end++;
- }
- else if(array[end]== ' ')//当遇到空格时,把空格之前的单词翻转,并且把start置为end
- {
- reserve(array,start,end-1);
- end++;
- start = end;//下一个单词的起始位置
- }
- }
- return String.valueOf(array);
- }
- private void reserve(char[] array,int start,int end)
- {
- char temp = ' ';
- while(start < end)
- {
- temp = array[start];
- array[start++] = array[end];
- array[end--] = temp;
- }
- }
package JianZhiOffer;
public class ReverseSentence
{
/**
* @param args
*/
public static void main(String[] args)
{
String s="I am a student";
System.out.println(ReverseSentence(s));
}
public static String ReverseSentence(String str)
{
if(str==null||str.length()<2)
return str;
char[] ch=str.toCharArray();
int start=0;
int end=0;
reverse(ch,0,ch.length-1);
while(end<ch.length)
{
if(ch[end]!=' ')
{
if(end==ch.length-1)
{
reverse(ch,start,end) ;
}
end++;
}
else if(ch[end]==' ')
{
reverse(ch,start,end-1);
end++;
start=end;
}
}
return String.valueOf(ch);
}
public static void reverse(char[] ch, int start, int end)
{
char temp=' ';
while(start<end)
{
temp=ch[start];
ch[start++]=ch[end];
ch[end--]=temp;
}
}
}