• 【编程题目】翻转句子中单词的顺序


    第 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;
    }
  • 相关阅读:
    XML与JSON的区别?各自有哪些优缺点?
    js数组操作(增、删、改、查)
    Ajax缓存原理
    Ajax的跨域问题分析
    简单理解javascript的闭包
    CSS的导入方式:link与import方式的区别
    谈谈iframe的优缺点
    winform全局异常捕获
    Dispatcher.BeginInvoke()方法使用不当导致UI界面卡死的原因分析
    解决asp.net中“从客户端中检测到有潜在危险的Request.Form值”的错误
  • 原文地址:https://www.cnblogs.com/dplearning/p/3968521.html
Copyright © 2020-2023  润新知