package com.two;
public class ReverseWords {
/**
* 题目:颠倒一个句子中的词的顺序。比如: I am a student颠倒后变成:student a am I.词以空格分隔。
* 要求:
* 1.实现速度最快,移动最少
* 2.不能使用String的方法如split,indexOf等等。
* 解答:两次翻转。
* 由于本题需要翻转句子,我们先颠倒句子中的所有字符。这时,不但翻转了句子中单词的顺序,而且单词内字符也被翻转了。我们再颠倒每个单词内的字符。由于单词内的字符被翻转两次,因此顺序仍然和输入时的顺序保持一致。
还是以上面的输入为例子。翻转“I am a student.”中所有字符得到“.tneduts a ma I”,再翻转每个单词中字符的顺序得到“students. a am I”,正是符合要求的输出。
*/
public static void main(String[] args) {
//String str=" ^busy living, or busy dying! $ ";
String str=" ^busy living ";
str=reverseWords(str);
System.out.println(str);
}
public static String reverseWords(String str){
if(str==null){
return null;
}
int length;
if((length=str.length())==0 || length==1){
return str;
}
char[] letters=str.toCharArray();
int begin=-1;
int end=-1;
boolean hasBegined=false;
boolean hasEnded=false;
for(int i=0,len=str.length();i<len-1;i++){
if(letters[i]!=' '){
if(!hasBegined){
begin=i;
hasBegined=true;
}else{
if(letters[i+1]==' '){//case 1
end=i;
hasEnded=true;
}
if(i==len-2&&letters[i+1]!=' '){//case 2
end=i+1;
hasEnded=true;
}
if(hasEnded){
reverseOneWord(letters,begin,end);//reverse each single word
hasBegined=false;
hasEnded=false;
}
}
}
}
reverseOneWord(letters,0,str.length()-1);//reverse the whole string
return new String(letters,0,str.length());
}
//reverse a single word
public static void reverseOneWord(char[] letters,int begin,int end){
if(letters==null||letters.length<2){
return;
}
int len=letters.length;
if(begin>=0&&begin<len&&end>=0&&end<len){
while(begin<end){
char tmp=letters[begin];
letters[begin]=letters[end];
letters[end]=tmp;
begin++;
end--;
}
}
}
}
转http://zhedahht.blog.163.com/blog/static/254111742007289205219/
http://bylijinnan.iteye.com/blog/1485828
public class StringTest6 {
private static void reverse(char[] src, int start, int end) {
while (start < end) {
char temp = src[start];
src[start] = src[end];
src[end] = temp;
start++;
end--;
}
}
private static void reverseWord(char[] centense) {
int i = 0;
int start = 0;
while (i < centense.length) {
if (centense[i] != ' ') {
i++;
}
else {
reverse(centense, start, i - 1);
i++;
start=i;
}
}
}
public static void main(String args[]) {
char[] centense = { 'i', ' ', 'l', 'o', 'v', 'e', ' ', 'y', 'o', 'u' };
reverse(centense, 0, centense.length - 1);
reverseWord(centense);
System.out.print(centense);
}
}