输入:字符数组;
输出:字符数组;转换规则:单词(非空格字符认为是单词构成)翻转,即最后一个单词在前,第一个单词在后,如此倒转。要求:时间复杂度O(n),时间复杂度O(1),即char[]原地转换。
eg:输入"Are you ready now.",输出"now. ready you Are"
思路:两次反转
public class Reverse {
char space = ' ';
public char[] reverseAll(char[] ch){
if(ch == null || ch.length == 0){
return ch;
}
reverse(ch, 0, ch.length-1);
int begin = 0;
int last = 0;
while (begin < ch.length){
if(ch[begin] == space){
begin ++;
last ++;
} else if(last == ch.length || ch[last] == space){
// last == ch.length必须写前面,否则数组越界异常
reverse(ch,begin,-- last);
begin = ++ last;
} else {
last ++;
}
}
return ch;
}
private void reverse(char[] ch, int start, int end) {
while (start < end){
char temp = ch[start];
ch[start] = ch[end];
ch[end] = temp;
start ++;
end -- ;
}
}
public static void main(String[] args) {
String Str = "Are you ready now";
System.out.println(new String(new Reverse().reverseAll(Str.toCharArray())));
}
}