问题描述
将一句话的单词进行倒置,标点不倒置。比如 “I like beijing.”,经过处理后变为:“beijing. like I”。字符串长度不超过100。
输入描述
输入一个仅包含小写字母、空格、‘.’ 的字符串,长度不超过100。
‘.’ 只出现在最后一个单词的末尾。
输出描述
依次输出倒置之后的字符串,以空格分割。
题目链接:倒置字符串
思路分析
- 一切有关于字符串的问题,其核心一定都是遍历;
- 观察倒置前后的差别,该问题的倒置可以分为2步:
2.1. 整体倒置输入的字符串;
2.2.根据空格分割单词,分别倒置每个子字符串;
代码实现
import java.util.Arrays;
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* 倒置字符串
* Date: 2022-11-06
* Time: 17:08
*/
public class Main {
//倒置函数,输入参数分别代表:需要倒置的字符串、倒置字符串的起始位置、结束位置
private static void reserve(char [] arr,int start,int end){
while (start<end){
char tmp=arr[start];
arr[start]=arr[end];
arr[end]=tmp;
start++;
end--;
}
}
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
//输入的字符串可能含有空格,因此要注意使用nextLine();
String str=scan.nextLine();
char [] s= str.toCharArray(); //将字符串转换为数组,方便倒置
int len=s.length;
//整体倒置字符串
reserve(s,0,len-1);
//分别倒置每个子字符串
int i=0;
while (i<len){
int j=i;
//通过空格区分每个子字符串
while (j<len&&s[j]!=' '){
j++;
}
//j<len代表不是最后一个子字符串
if(j<len){
reserve(s,i,j-1);
i=j+1; //此时j所在的位置是空格,因此i需要指向空格的下一个字符
}else {
//代码执行到此处的条件是:j指向了字符串的最后一个字符
reserve(s,i,j-1);
i=j; //不可以是i=j+1,会造成数组越界
}
}
String s1=new String(s); //如果直接使用toString()方法,在牛客系统上无法通过
System.out.println(s1);
}
}
当然,如果是单单为了解决这个问题,自然也有更加简单的方法,即使用一些库函数来完成:
import java.util.Scanner;
/**
* Created with IntelliJ IDEA.
* Description:
* 倒置字符串
* Date: 2022-11-06
* Time: 17:45
*/
public class test {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
String str=scanner.nextLine();
String[] arr=str.split(" "); //以空格来分割字符串,使用一个String类型的数组来接收
StringBuilder builder=new StringBuilder();
for (int i=arr.length-1;i>=0;i--){
builder.append(arr[i]+" "); //从这个字符数组的最后一个字符开始,在末尾追加空格
}
// builder.deleteCharAt(builder.length()-1); //这行代码时删除字符串指定索引位置的字符,在此处不影响运行结果
System.out.print(builder.toString());
}
}
over!