算法题:句子逆序(堆栈&&向量)

    xiaoxiao2021-04-15  271

    题目描述

    将一个英文语句以单词为单位逆序排放。例如“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; } }

    最新回复(0)