1.题目描述:(京东面试题)
给定一个字符串,字符串是由空格和字母组成。我们现在需要做的是把字符串反转,但是保证两个空格间的字母顺序不变。例如“#I##am#a##student.##”->"##student.##a#am##I#"。其中“#”表示空格。(注意和剑指offer第58题的区别!【单词之间只有一个空格】)
2.解题思路:
我们首先可以整体把字符串反转,然后再根据空格的位置来判断单词起始和结束的位置(最后一个单词单独考虑!!),我们确定单词的起始和结束位置以后,再对每一个单词单独进行反转。
例如:“#I##am#a##student.##”-> "##.tneduts##a#ma##I#" ->->"##student.##a#am##I#"
注意特殊的输入:字符串中都是空格,字符串为空或者字符串尾部有多个字符串。。
3.Java代码:
public class Main {
public static String ReverseSentence(String str){
if(str == null)return null;
if(str.trim().equals(""))return str;
StringBuffer stringBuffer = new StringBuffer(str);
stringBuffer.reverse();
int start = 0;
for (int i = 0; i < stringBuffer.length();i++) {
//把最后一个子字符串单独处理,因为最后一个字符串的结尾不一定是空格(这里说的反转过后的字符串)
if(i == stringBuffer.length()-1){
stringBufferReverse(stringBuffer, start, i+1);
}
//i!=0防止字符串的第一个是空格
if(stringBuffer.charAt(i) == ' ' && i != 0){
stringBufferReverse(stringBuffer, start, i);
}
//找到下个子字符串的起点
while(stringBuffer.charAt(i) == ' '){
i++;
start = i;
}
}
return stringBuffer.toString();
}
//字符串的反转因为只能在StringBuffer中才有,为了对String中的子串实现反转,我们定义了如下函数:
public static void stringBufferReverse(StringBuffer sBuffer, int start, int end) {
String string = sBuffer.substring(start, end);
StringBuffer temp = new StringBuffer(string);
temp.reverse();
sBuffer.replace(start, end, temp.toString());
}
public static void main(String[] args) {
//String str = "I am a student.";
//String str = " ";
String str = "I am a student. ";
System.out.println(ReverseSentence(str));
}
}