1 句子逆序
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I”,所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符。
接口说明
/**
- 反转句子
- @param sentence 原句子
- @return 反转后的句子
*/
public String reverse(String sentence);
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
输入
I am a boy
输出
boy a am I
方法1:先分割,然后利用数组逆序输出即可。
import java.util.*;
public class Main{
public static String reverse(String sentence){
StringBuffer ret = new StringBuffer();
String[] str = sentence.split(" ");
for(int i=str.length-1;i>=0;i--){
ret.append(str[i]+" ");
}
return ret.toString().trim();
}
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(reverse(str));
}
}
方法2:利用数组逆置,先对整体进行逆置,再对每个单词进行逆置。
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while (cin.hasNextLine()) {
String str = cin.nextLine();
System.out.println(reverseSentence(str));
}
}
//逆置函数
public static void reverse(char[] ch,int start,int end) {
while(start < end) {
char tmp=ch[start];
ch[start]=ch[end];
ch[end]=tmp;
start++;
end--;
}
}
//核心代码
public static String reverseSentence(String str) {
if(str == null) {
return null;
}
char[] ch = str.toCharArray();
//先对整体进行逆置
reverse(ch,0,str.length()-1);
int i = 0;
int j = 0;
//开始部分逆置
while(i < ch.length) {
//都是空格,都进行++
if(ch[i] == ' ') {
i++;
j++;
}else if(j == ch.length || ch[j] == ' ' ) {
//顺序不能反,否则会空指针异常
//逆置每个单词,这里是--j,j本身会发生移动
reverse(ch,i,--j);
i = ++j;
}else {
++j;
}
}
return String.copyValueOf(ch);
}
}
其中,i指向单词的首,j指向单词的尾。
注意:else if(j == ch.length || ch[j] == ' ' )
中的判断顺序不能颠倒,因为在判断最后一个单词时,j==ch.length
,这时访问ch[j]
的下标会发生越界,所以j == ch.length
需要放在前面,来防止ch[j]的执行。
2 单词倒排(分隔符为非字母)
对字符串中的所有单词进行倒排。
说明:
1、每个单词是以26个大写或小写英文字母构成;
2、非构成单词的字符均视为单词间隔符;
3、要求倒排后的单词间隔符以一个空格表示;如果原字符串中相邻单词间有多个间隔符时,倒排转换后也只允许出现一个空格间隔符;
4、每个单词最长20个字母;
输入描述:
输入一行以空格来分隔的句子
输出描述:
输出句子的逆序
输入
I am a student
输出
student a am I
注意:
本题对单词分割符不设限制, 只要非字母, 都需要当成分割符, 并且分割符的数目不受限制
import java.util.Scanner;
public class Main{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
String[] ret = str.split("[^a-zA-Z]+");
StringBuilder ch = new StringBuilder();
for(int i = ret.length-1;i>=0;i--){
ch.append(ret[i]+" ");
}
System.out.println(ch.toString().trim());
}
}
对于间隔符为非字母,这里用到了正则表达式 String[] sp = sc.nextLine().split("[^a-zA-Z]+");