题目描述
牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
思路
student. a am I
先全部翻为I ma a .tnedutS.
,然后每个单词进行反转,为I am a Student.
java实现
public class Solution {
public String ReverseSentence(String str) {
if (str == null || str.length()==0)
return "";
int begin = 0;
int end = str.length() - 1;
char[] chars = str.toCharArray();//字符转为字符数组
reverse(chars, begin, end);//整个字符数组翻转
int blank = -1;
//每个单词进行翻转(开始结束位置为空格位置)
for (int i = 0; i < chars.length; i++) {
if (chars[i] == ' ') {
int nextBlank = i;//记录这个空格位置(为要翻转的结束位置)
reverse(chars, blank + 1, nextBlank - 1);//上一个空格位置到这个空格位置之间字符进行反转
blank = nextBlank;//将新的位置记录为下一次要翻转的开始位置
}
}
reverse(chars, blank + 1, chars.length - 1);//最后一个单词单独翻转,因为其后面没有空格了
String result = new String(chars);
return result;
}
//begin-end之间字符反转
public void reverse(char[] chars, int begin, int end) {
while (begin < end) {
char tmp = chars[begin];
chars[begin] = chars[end];
chars[end] = tmp;
begin++;
end--;
}
}
}
借助java中split与StringBuilder
public class Solution {
public String ReverseSentence(String str) {
if (str == null || str.length() == 0 || str.trim().length() == 0) //String中trim()删除字符串的头尾空白符
return str;
StringBuilder sb = new StringBuilder();
String[] s = str.trim().split(" ");// 分为string数组,每个数组元素为一个单词 :student. a am I
for (int i = s.length - 1; i >= 0; i--) { //从最后一个单词开始增加
if (s[i] != "") //一次添加每一个数组元素,即一个单词
sb.append(s[i]);
if (i - 1 >= 0)//除最后一个单词,其余单词后加空格
sb.append(" ");
}
return sb.toString();
}
}