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]+");