/**
* 翻转单词顺序列
*
* 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。
* 同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。
* 例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。
*/
public class JZ044ReverseSentence {
/**
* 字符串按照空格切开,然后双指针交换
* @param str
* @return
*/
public static String ReverseSentence(String str) {
if (str == null || str.length() <= 1) {
return str;
}
String[] s = str.split(" ");
if (s.length >= 1) {
int start = 0;
int end = s.length - 1;
while (start < end) {
String tmp = s[start];
s[start] = s[end];
s[end] = tmp;
start++;
end--;
}
StringBuffer sb = new StringBuffer();
for (int i = 0; i < s.length - 1; i++) {
sb.append(s[i]).append(" ");
}
sb.append(s[s.length - 1]);
return sb.toString();
}
return str;
}
/**
* 字符串按照空格切开
* 各个单词内按照字符进行交换
* 整个字符串按照字符进行交换
* @param str
* @return
*/
public static String ReverseSentence2(String str) {
if (str == null || str.length() <= 1) {
return str;
}
String[] ss = str.split(" ");
if (ss.length >= 1) {
StringBuffer sb = new StringBuffer();
for (String s : ss) {
char[] cs = s.toCharArray();
reverseChar(cs, 0, cs.length - 1);
sb.append(cs).append(" ");
}
String str2 = sb.substring(0, str.length());
char[] cs2 = str2.toCharArray();
reverseChar(cs2, 0, cs2.length - 1);
return new String(cs2);
}
return str;
}
/**
* 全部转换成字符数组,到出现字符为' '的判断处理
* @param str
* @return
*/
public static String ReverseSentence3(String str) {
if (str == null || str.length() <= 0) {
return str;
}
char[] cs = str.toCharArray();
int start = 0;
for (int i = 0; i < cs.length; i++) {
if (cs[i] == ' ') {
reverseChar(cs, start, i - 1);
start = i + 1;
}
}
reverseChar(cs, start, cs.length - 1);
reverseChar(cs, 0, cs.length - 1);
return new String(cs);
}
private static void reverseChar(char[] cs, int start, int end) {
while (start < end) {
char tmp = cs[start];
cs[start] = cs[end];
cs[end] = tmp;
start++;
end--;
}
}
public static void main(String[] args) {
String str = "student. a am I";
System.out.println(ReverseSentence(str));
System.out.println(ReverseSentence2(str));
}
}