zoukankan      html  css  js  c++  java
  • 7-32 说反话-加强版

    7-32 说反话-加强版(20 分)

    给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。

    输入格式:

    测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。

    输出格式:

    每个测试用例的输出占一行,输出倒序后的句子,并且保证单词间只有1个空格。

    输入样例:

    Hello World   Here I Come
    

    输出样例:

    Come I Here World Hello
    思路:递归—倒着遍历字符串遇到下个字符非空格就继续进行递归,否则输出该字符,试了下但是超时了!然后就用栈重写了一遍,遇到不是空格就入栈,否则将栈全部输出,至于细节处理还是看代码吧。
    提供第三个测试点的一组数据:
    输入样例:
          a       
    输出样例:
    a
    注意前后没有多余空格!
    
    
    递归代码如下:
    #include<stdio.h>
    #include<string>
    #include<iostream>
    using namespace std;
    int f(string s, int pos, int len=0)
    {
        if (pos == 0){                        //当碰到第一个字符时,输出并返回
            cout << s[pos];
            return 1;
        }
    
        if (s[pos - 1] == ' '){
            cout << s[pos];            //当下一个字符为空格时,输出并返回
            return 1;
        }
            
        
        int flag = 1 + f(s, pos - 1, len + 1);            //flag为当前的单词长度
        cout << s[pos];
        return flag;
    }
    int main()
    {
        string line;
        getline(cin, line);
        string container;
        int first = 0;                                //first用来解决空格输出,第一个单词不输出空格
        for (int i = line.length() - 1; i >= 0; i--)
        {
            int flag = 0;
            if (line[i] != ' '){                
                if (first != 0) cout << " ";            
                flag = f(line, i);
                i -= flag;                //一个单词输出后,该单词的字符将不进行你个查询
                first++;
    
            }
        
        }
        cout << endl;
        return 0;
    }
    递归写法

    AC代码如下:

    #include<stdio.h>
    #include<string>
    #include<stack>
    #include<iostream>
    using namespace std;
    int main()
    {
        string line;
        getline(cin, line);
        stack<char> cnt;                        //借用栈来保存字符
        
        int first = 0;                                //first用来解决空格输出,第一个单词不输出空格
        for (int i = line.length() - 1; i >= 0; i--)
        {
            
            if (line[i] != ' '&&i!=0)                
                cnt.push(line[i]);
            else {
                if (first != 0&&!cnt.empty()) cout << " ";
                if (i == 0 && line[0] != ' ') cnt.push(line[0]);
    
                int flag = 0;
                while (!cnt.empty()){                        //遇到空格或者i=零,只要栈非空则输出
                    cout << cnt.top();
                    cnt.pop();
                    flag = 1;
                }
    
                if (flag==1)                            //只有单词输出才能加一
                    first++;
            }
    
        }
        cout << endl;
        return 0;
    }

    如果有不懂得栈的,推荐以下

    http://blog.csdn.net/wallwind/article/details/6858634

  • 相关阅读:
    jsp_Scriptlet
    jsp_注释
    Http状态码详解
    Tomcat服务器的安装和配置
    【BZOJ 1018】线段树 **
    【BZOJ 2054】 2054: 疯狂的馒头 (并查集特技)
    【BZOJ 1969】 1969: [Ahoi2005]LANE 航线规划 (树链剖分+线段树)
    【BZOJ 1880】 [Sdoi2009]Elaxia的路线 (最短路树)
    【UOJ 79】 一般图最大匹配 (✿带花树开花)
    【UOJ 34】 多项式乘法 (FFT)
  • 原文地址:https://www.cnblogs.com/zengguoqiang/p/8336665.html
Copyright © 2011-2022 走看看