题目描述:
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
题目解答:
法一,通过 java 中的分割字符串然后逆序存储来实现,要注意空格字符串的处理
法二,先翻转整个字符串,之后再依次翻转单词来实现,同样要注意空格字符串的处理
import java.util.*;
public class Solution {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
while (input.hasNext()) {
String str = input.nextLine();
System.out.println("Solution1:");
System.out.println(ReverseSentence1(str));
System.out.println("Solution2:");
System.out.println(ReverseSentence2(str));
}
input.close();
}
public static String ReverseSentence1(String str) {
//注意空格字符串的处理
if (str.trim().equals("")) {
return str;
}
String[] substr = str.split(" ");
String result = "";
for (int i = substr.length - 1; i >= 0; i--) {
result += substr[i] + " ";
}
return result.trim();
}
public static String ReverseSentence2(String str) {
if (str.trim().equals("")) {//处理空白字符串
return str;
}
char[] c = str.toCharArray();
reverse(c, 0, c.length - 1);//翻转整个字符串
int begin = 0, end = 0;
//循环翻转单词
while (begin != c.length) {
if (c[begin] == ' ') {//定位单词的开始位置
begin++;
end++;
} else if (c[end] == ' ') {//定位单词结束位置
end--;
reverse(c, begin, end);
begin = ++end;
} else if (end == c.length - 1) {
reverse(c, begin, end);
begin = ++end;
} else {
end++;
}
}
return String.valueOf(c);
}
public static void reverse(char[] c, int begin, int end) {
while (begin < end) {
char temp = c[begin];
c[begin] = c[end];
c[end] = temp;
begin++;
end--;
}
}
}
运行结果:Input:
student. a am I
hello world
result
Output:
Solution1:
I am a student.
Solution2:
I am a student.
Solution1:
world hello
Solution2:
world hello
Solution1:
result
Solution2:
result
总结:
其一,str.trim() 可用于去除字符串 str 首尾的空格
String.value() 可以将括号内的数据转换为字符型数据
其二,在牛客网中测试数据不强,法一忽略了空格数据竟然可以过,但是不推荐使用