题目描述
将一个英文语句以单词为单位逆序排放。例如“I am a boy”,逆序排放后为“boy a am I” 所有单词之间用一个空格隔开,语句中除了英文字母外,不再包含其他字符
接口说明
/**
反转句子@param sentence 原句子@return 反转后的句子 */ public String reverse(String sentence);
输入描述:
将一个英文语句以单词为单位逆序排放。
输出描述:
得到逆序的句子
示例1 输入
I am a boy
输出
boy a am I
解题思路
提供两种思路进行求解
采用堆栈,压栈弹栈完成倒序采用向量存储,使用基础算法库中向量逆转完成
代码实现
堆栈方法
#include<iostream>
#include<string>
#include<stack>
#include<algorithm>
using namespace std;
int main()
{
string sentence="";
stack <string> Stk;
do
{
cin>>sentence;
//压栈
Stk.push(sentence);
}
while(cin.get()!='\n');
while(!Stk.empty())
{
//取栈顶元素
cout<<Stk.top()<<" ";
//弹栈
Stk.pop();
}
cout<<endl;
return 0;
}
向量方法
#include<iostream>
#include<string>
#include<vector>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
string sentence="";
//创建字符串向量
vector <string> v;
do
{ cin>>sentence;
//添加到向量末尾
v.push_back(sentence);
}
while(cin.get()!='\n');
//逆转
reverse(v.begin(), v.end());
//初始化向量迭代器
vector <string> :: iterator head = v.begin(),tail = v.end();
//创建迭代器并与输出挂钩
ostream_iterator<string> oit(cout," ");
//向量数据转至迭代器
copy(head, tail, oit);
cout<<endl;
return 0;
}
总结
1.也可采用java 或python中提供split函数按空格分割成新的列表或字符串数组,接着从后至前输出 但相对时间和空间复杂度都会提升(代码附在最后) 2.标准算法库algorithm提供的算法一般效率优于自写,可以优先考虑使用标准模板。 3.c++提供了丰富的数据结构模板
import java.util.Scanner;
public class Main{
public static void main(String [] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(reverse(str));
}
public static String reverse(String sentence){
String temp="";
//按空格分词放入数组
String arr[] = sentence.split(" ");
for (int i = arr.length-1;i>=0;i--)
{
//倒序拼接
temp = temp + arr[i] + " ";
}
return temp;
}
}