题解 | #句子逆序#
句子逆序
http://www.nowcoder.com/practice/48b3cb4e3c694d9da5526e6255bb73c3
题意整理。
- 输入一行英文句子,单词间以空格隔开。
- 以单词为单位逆序处理,并输出。
方法一(反转)
1.解题思路
- 首先将输入的句子变为字符数组。
- 将字符数组整体反转,然后再反转每一个单词,即可得到预期的结果。最后将字符数组转化为字符串并输出。
图解展示:
2.代码实现
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
//转化为字符数组
char[] arr=s.toCharArray();
//整体反转
reverse(arr,0,arr.length-1);
int index=0;
for(int i=0;i<arr.length;i++){
if(arr[i]==' '){
//局部反转
reverse(arr,index,i-1);
index=i+1;
}
}
//局部反转最后一个单词
reverse(arr,index,arr.length-1);
//转为为字符串,并输出
System.out.println(String.valueOf(arr));
}
//字符数组反转
private static void reverse(char[] arr,int i,int j){
while(i<j){
//交换对应位置的值
char temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
//移动指针
i++;
j--;
}
}
}
3.复杂度分析
- 时间复杂度:输入的句子长度不超过1000,局部反转和整体反转的时间复杂度均为常数级别,所以时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。
方法二(字符串分割)
1.解题思路
- 新建res,用于记录结果。
- 然后将输入的句子以空格为单位,分割为字符串数组。
- 对得到的字符串数组进行逆序遍历,将对应的单词添加到res。
- 遍历完成后,将res转为字符串,并输出。
2.代码实现
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
//新建res,用于记录结果
StringBuilder res=new StringBuilder();
//以空格为单位,分割为字符串数组
String[] arr=s.split(" ");
//逆序遍历
for(int i=arr.length-1;i>=0;i--){
//添加对应的单词
if(i!=0){
res.append(arr[i]+" ");
}
else{
res.append(arr[i]);
}
}
System.out.println(res.toString());
}
}
3.复杂度分析
- 时间复杂度:字符串长度不超过1000,分割及逆序遍历的时间复杂度均为常数级别,所以时间复杂度为。
- 空间复杂度:需要额外常数级别的空间,所以空间复杂度为。
xqxls的题解 文章被收录于专栏
牛客题解