zoukankan      html  css  js  c++  java
  • 【编程题目】翻转句子中单词的顺序

    第 10 题(字符串)
    翻转句子中单词的顺序。
    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
    句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
    例如输入“I am a student.”,则输出“student. a am I”。

    思路:用栈,把每个单词压入栈,再依次弹出输出。

    /*
    第 10 题(字符串)
    翻转句子中单词的顺序。
    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。
    句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。
    例如输入“I am a student.”,则输出“student. a am I”。
    start time 15:12
    end time 15:39
    */
    
    #include <iostream>
    #include <vector>
    using namespace std;
    
    typedef struct Words{
        int len;
        char * start;
    }Words;
    void reverseSentence(char * c)
    {
        vector<Words> S; //存储单词的栈
    
        Words w;
        w.start = c;
        w.len = 0;
        for (int i = 0; c[i] != ''; i++)
        {
            if (c[i] != ' ')
            {
                w.len++;
            }
            else
            {
                if (w.len != 0)
                {
                    S.push_back(w);
                    w.start = c + i + 1;
                    w.len = 0;
                }
                else //跳过多余的空格
                {
                    w.start = c + i + 1;
                }
            }
        }
        if (w.len != 0) //压入最后一个词
        {
            S.push_back(w);
        }
    
        while (!S.empty())
        {
            Words w = S.back();
            for (int i = 0; i < w.len; i++)
            {
                cout << *(w.start + i);
            }
            cout << ' ';
            S.pop_back();
        }
        cout << endl;
    }
    
    int main()
    {
        char * c = "  I   am  a student.";
        reverseSentence(c);
    
        return 0;
    }

    网上找答案,发现我的方法空间复杂度很高,O(n)网上通用的方法是原地翻转句子,再把每个单词翻转回来。

    http://www.cnblogs.com/yanhaiming/archive/2012/07/17/2595817.html

    #include<iostream>
    #include<vector>
    #include<assert.h>
    #include<cstring>
    using namespace std;
    
    
    void swap(char &a, char &b)
    {
        char tmp = b;
        b = a;
        a = tmp;
    } 
    
    void swap_str(char* str, int start, int end)
    {
        assert(str!=NULL && start <= end);
        int low = start;
        int high = end; 
    
        //整个句子按字符翻转
        while (low < high)
        {
            swap(str[low], str[high]);
            low++;
            high--;
        }
    }
    
    //方法一:依次读入句子中的每个单词,并将它们放入一个栈中。然后再将单词出栈。
    //时间复杂度:O(n),空间复杂度:O(n);
    
     
    
    //方法二:首先将整个句子按字符翻转,然后再将其中每个单词的字符旋转。
    //时间复杂度:O(n),空间复杂度:O(1);
    void reverse_word(char str[])
    {
        int len = strlen(str); 
    
        //翻转整个句子
        swap_str(str, 0, len-1);
     
        int s = 0;
        int e = 0;
        //翻转每个单词
        for (int i=0; i<len; i++)
        {
            e = i;
            if (str[e] == ' ')
            {
                //str[e]为空格,所以范围是[s,e-1].
                swap_str(str, s, e-1);
                s = e + 1;
            }
        }
    }
    
     
    int main()
    {
        char str[] = "I am a student.";
        reverse_word(str);
        cout<<str<<endl;
        return 0;
    }
  • 相关阅读:
    模仿outlook快捷方式栏的一个控件
    买了一本书《Programming pearls》编程珠玑(88上的数学题目(1))
    一个IE动画图标的小例子
    对水波特效实现原理的解释
    向量空间的几何变换
    一个简单Led控件
    【转载】配置(visual studio.net已检测到指定的web服务器运行的不是asp.net1.1版)
    最近学习ASP2.0相关的几个小问题(非创新性文章)
    一道c的面试题,大数相乘。
    Led控件(2)——Led显示屏模拟
  • 原文地址:https://www.cnblogs.com/dplearning/p/3968521.html
Copyright © 2011-2022 走看看