(from 牛客)
给定字符串,在单词间进行逆序
如“hello world!”逆序后为“world! hello”;
如“I love you.”逆序后为“you. love I”;
以下办法均用Java实现,思想最重要
1.直接使用String的split方法
public String reverseWords(String str) {
// 使用split(" ")会删除最后的空字符串,但不会删除最前面的
// 如果添加一个limit参数-1,则会显示所有的空字符串
String[] words = str.split(" ",-1);
StringBuilder sb = new StringBuilder("");
for(int i = words.length-1;i>=0;i--) {
if(i==0)
sb.append(words[i]);
else
sb.append(words[i]+" ");
}
return sb.toString();
}
public static void main(String[] args) {
String str = " i love dog. ";
ReverseWords reversWords = new ReverseWords();
System.out.println(reversWords.reverseWords(str));
}
输出结果“ dog. love i ”。(语句前后的空格全部显示出来了的。)
2.不用split函数切割,直接用代码实现反转。当反转每个单词时,需要设置两个变量start和end用来指向单词的第一个位置和单词的下一个位置,end值每次加1,当end指向的值不为空格,则end继续递增;当end值为空格,需要判断end和start的位置。如果start小于end,则说明start和end之间为一个单词,此时可以进行反转,反转后,end加一,并赋值给start;如果start等于end,则说明当前指向的为空格,将空格添加进字符串中,end加1,并复制给start。
step1:构造reverse函数用来反转整个字符串的顺序
step2:再调用reverse反转每个单词的顺序
(step1和step2顺序可以对调)
public String reverse(String str) {
int start = 0;
int end = str.length()-1;
//只有StringBuilder才有setCharAt方法,因此不能用String
StringBuilder sb = new StringBuilder(str);
while(start<end){ char ch = sb.charAt(start);
sb.setCharAt(start++,sb.charAt(end));
sb.setCharAt(end--,ch);
}
return sb.toString();
}
public String reverseWords(String str){
String rvsStr = reverse(str);
int start = 0;
int end = 0;
StringBuilder sb = new StringBuilder("");
while(end<rvsStr.length()){ if(rvsStr.charAt(end)!=' ') end++;
else if(end>start){ String subStr = reverse(rvsStr.substring(start,end));
sb.append(subStr+" ");
end++;
start = end;
}
else{
sb.append(" ");
end++;
start = end;
}
}
//如果结尾为单词,则还需要执行下面的反转步骤
if(end>start){ String subStr = reverse(rvsStr.substring(start,end));
sb.append(subStr);
}
return sb.toString();
}
public static void main(String[] args) {
String str = " i love dog. ";
ReverseWords reversWords = new ReverseWords();
System.out.println(reversWords.reverseWords(str));
}
输出结果“ dog. love i ”。