题目描述:翻转单词顺序
-
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
-
为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。
-
注意:不允许使用String类的split()方法进行切割
-
建议使用思路3
思路1:
public class Program020 {
public static void main(String[] args) {
System.out.println(reverseWord("I am a student. ")); // 输出结果:student. a am I
System.out.println(reverseWord("the sky is blue")); // 输出结果:blue is sky the
System.out.println(reverseWord(" hello world! ")); // 输出结果:world! hello
}
/**
*
* @param str 需要进行单词翻转的原字符串
* @return 翻转单词后的字符串结果
*/
public static String reverseWord(String str) {
//用于保存需翻转的单词
StringBuilder sb=new StringBuilder();
//用于保存反转字符串
StringBuilder reverseSb=new StringBuilder();
//遍历字符串
for(int i=str.length()-1;i>=0;i--) {
//判断当前字符是否为空字符
if(str.charAt(i)!=' ') {
//将其追加至当前sb(该单词字符串)
sb.append(str.charAt(i));
//判断当前字符是否是第1位
if(i==0) {
//翻转当前单词
sb.reverse();
//追加至sb
reverseSb.append(sb);
}
}
//若当前字符为空字符且不是最后一个字符
if(str.charAt(i)== ' '&&i!=str.length()-1) {
//翻转当前单词
sb.reverse();
//追加至sb1
reverseSb.append(sb);
reverseSb.append(' ');
//清空当前单词字符串
sb=new StringBuilder();
}
}
return reverseSb.toString();
}
}
思路2:
public class Program020 {
public static void main(String[] args) {
System.out.println(reverseWord("I am a student. ")); // 输出结果:student. a am I
System.out.println(reverseWord("the sky is blue")); // 输出结果:blue is sky the
System.out.println(reverseWord(" hello world! ")); // 输出结果:world! hello
}
/**
*
* @param str 需要进行单词翻转的原字符串
* @return 翻转单词后的字符串结果
*/
public static String reverseWord(String str) {
//将String类型的str转换成StringBuilder类型
StringBuilder sb=new StringBuilder(str);
//将sb反转( .tneduts a ma I)
sb.reverse();
//用于保存反转字符串的“单词”,
StringBuilder sb1=new StringBuilder();
//遍历sb
for(int i=0;i<str.length();i++) {
//判断当前字符是否为空字符
if(sb.charAt(i)!=' ') {
//将其追加至当前sb1(该单词字符串)
sb1.append(sb.charAt(i));
//判断当前字符是否是最后一位
if(i==str.length()-1) {
//翻转当前单词
sb1.reverse();
//追加至sb
sb.append(sb1);
}
}
//若当前字符为空字符且不是第一个字符
if(sb.charAt(i)== ' '&&i!=0) {
//翻转当前单词
sb1.reverse();
//追加至sb
sb.append(sb1);
sb.append(' ');
//清空当前单词字符串
sb1=new StringBuilder();
}
}
//删除sb中前面的反转字符串(.tneduts a ma Istudent. a am I)
sb.delete(0, str.length());
return sb.toString();
}
思路3:
public class Program020 {
public static void main(String[] args) {
System.out.println(reverseWord("I am a student. ")); // 输出结果:student. a am I
System.out.println(reverseWord("the sky is blue")); // 输出结果:blue is sky the
System.out.println(reverseWord(" hello world! ")); // 输出结果:world! hello
}
/**
*
* @param str 需要进行单词翻转的原字符串
* @return 翻转单词后的字符串结果
*/
public static String reverseWord(String str) {
//去除原字符串的左右两边空格
str=str.trim();
//使用StringJoiner收集翻转单词的结果,使用空格进行分隔
StringJoiner joiner=new StringJoiner(" ");
//从尾部开始,遍历字符串中的每个字符;endIndex记录每次开始下标的位置,用于方便截取
for(int i=str.length()-1,endIndex=i;i>=0;i--) {
//获取当前字符
char currentChar=str.charAt(i);
//判断当前字符是否为空格或者为第1个字符
if(currentChar==' '||i==0) {
//从当前位置i开始截取至endIndex,并连接至StringJoiner
joiner.add(str.substring(i, endIndex+1).trim());
//保存当前i的位置(即下次截取的结束位置)
endIndex=i;
}
}
return joiner.toString();
}
}