zoukankan      html  css  js  c++  java
  • LeetCode 151 reverse word in a string

    Given an input string, reverse the string word by word.

    For example, Given s = "the sky is blue", return "blue is sky the".

    Update (2015-02-12): For C programmers: Try to solve it in-place in O(1) space.

    这题遇到的困难主要是细节地方处理的不好:(1)空格的处理,(2)标点符号reverse?

    主要思路:(1)万事开头难,你必须首先就把一些空串,单个字符串等一些在后面会出现bug的输入处理掉!!!

                  (2)把第一步处理好之后,将整个字符串翻转过来,标点当成字符处理。

                  (3)每个单词翻转,并用一个string存储。然后补充一个空格,直到处理完整个串。

                  (4)判断字符串是否为空(如果前面输入多个空格,到这里得到一个空字符串),非空则删除最后一个空格。

                  (5)输出结果。

    在单词翻转的时候,使用布尔型wordHead记录是否是单词头而不是空格,确保只针对单词翻转。

    class Solution {
    public:
        void reverseWords(string &s)
    {
        int n = s.size() - 1;
        int wHead = 0;
        int wTail = n ;
        char cPunct = ' ';
        if(s.size() == 0)
        {
            return;
        }
        if( n == 0 )
        {
            if(s[0] == ' ')
            {
                s.clear();
            }
            return;
        }
        
        while( wHead < wTail )
        {
            char temp = s[wTail];
            s[wTail] =  s[wHead];
            s[wHead] = temp;
            wHead++;
            wTail--;
        }
    
        wTail = wHead = 0;
        string sRet;
        bool wordHead = true;
        while(wTail <= n)
        {
            if(!isspace(s[wTail]) && wordHead)
            {
                wHead = wTail;
                wordHead = false;
            }
            if( ( s[wTail] == ' ' || wTail == n) && !isspace(s[wHead]))
            {
                if(wTail == n && !isspace(s[wTail]))
                    wTail++;
                sRet  += SwapWord(s, wHead, wTail - 1) + " ";
                wHead =  wTail + 1;
                wordHead = true;
             }
            wTail++;
        }
        s = sRet;
        if(s.size() > 0)
        s.erase(s.size()-1, 1);
    
    }
     string SwapWord(string &s, int wHead, int wTail)
     {
         int wStart = wHead;
         int wEnd = wTail;
    
         while( wStart < wEnd )
         {
             char temp = s[wStart];
             s[wStart] = s[wEnd];
             s[wEnd] = temp;
             wStart++;
             wEnd--;
         }
        return  s.substr(wHead, wTail - wHead + 1);
     }
    
    };

    应该认真的对待OJ上自己力所能及的每一题,多思考!

  • 相关阅读:
    浅析c#中new、override、virtual关键字的区别
    数据解析1113
    Silverlight中xaml之间的跳转方案之一
    silverlight读取client文件的完整路径
    (Transfered)WPF Tutorial:Beginning
    数据解析1112
    邮件发送1
    TortoiseSVN Settings Subversion
    德信无线10Q4净利润同比增进187%
    欧盟中止对我数据卡双反调查
  • 原文地址:https://www.cnblogs.com/bestwangjie/p/4433957.html
Copyright © 2011-2022 走看看