• leetcode Reverse Words 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".

    Clarification:
    • What constitutes a word?
      A sequence of non-space characters constitutes a word.
    • Could the input string contain leading or trailing spaces?
      Yes. However, your reversed string should not contain leading or trailing spaces.
    • How about multiple spaces between two words?
      Reduce them to a single space in the reversed string.

    具体实现见代码,值得注意的是在反转的过程中本来用的是char *数组,使用sprintf一直报OLE错误,后来改用string的append就可以了。参考代码两个方法实现,其中第二个参考网上的,效率其实差不多。。。但是代码确实精简很多。。。

    #include <iostream>
    #include <fstream>
    #include <vector>
    #include <string>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <cmath>
    #include <queue>
    #include <set>
    #include <list>
    #include <cctype>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define REP(i,j,k) for(int i = j ; i < k ; ++i)
    #define MAXV (1000)
    #define INF (0x6FFFFFFF)
    using namespace std;
    
    class Solution
    {
    public:
        void reverseWords(string &s) {
            bool first = true;
            const char *x = s.c_str();
            int word_start[100000]= {0};//记录一个单词的开始下标
            int word_end[100000]= {0};//记录一个单词的结束下标
            int cnt = 0;
            unsigned i=0;
            for(;;) {
                while(x[i]==' ')//跳过空格
                    ++i;
                if(i >= s.size())
                    break;
                word_start[cnt] = i;//记录单词的开始位置
                while(x[i]!=' '&&x[i]!='')
                    ++i;
                word_end[cnt++] = i-1;//记录单词的结束位置
            }
            string str;
            while(cnt--) {//从后往前将单词append到str中
                char temp_s[100000];//一个单词
                int t=word_end[cnt]-word_start[cnt]+1;
                int temp_cnt=word_start[cnt],j=0;
                for(j=0; j<t; ++j) {
                    temp_s[j]=x[temp_cnt++];
                }
                temp_s[j]=0;//位置j置0表示单词结束
                if(first) {
                    str.append(temp_s);
                    first = false;
                } else
                    str.append(" ").append(temp_s);
            }
            s = str;
             cout<<s<<"*111"<<endl;
        }
        void reverseWords1(string &s) {
            string rs;
            for (int i = s.length()-1; i >= 0; ) {
                while (i >= 0 && s[i] == ' ') i--;
                if (i < 0) break;
                if (!rs.empty()) rs.push_back(' ');
                string t;
                while (i >= 0 && s[i] != ' ') t.push_back(s[i--]);
                reverse(t.begin(), t.end());
                rs.append(t);
            }
            s = rs;
            cout<<s<<"*222"<<endl;
        }
    };
    
    int main()
    {
        //freopen("in.txt","r",stdin);
        Solution s;
        string kk = "  I love!!      you so much   ";
        string k1 = kk;
        string k2 = kk;
        s.reverseWords1(k1);
        s.reverseWords(k2);
        return 0;
    }
  • 相关阅读:
    转物理老师的说说,过好自己的生活,别人的梦幻生活背后也有你看不见的无奈
    第一、二、三、BC范式的学习总结
    一位毕业四年的前辈的经历
    普里姆算法,克鲁斯卡尔算法,迪杰斯特拉算法,弗洛里德算法
    从零开始构建JavaScript框架4——DOM遍历2
    从零开始构建JavaScript框架3——DOM遍历1
    从零开始构建JavaScript框架2——总体结构以及元素的获取和创建
    从零开始构建JavaScript框架1——为何JavaScript开发需要框架
    从浏览器输入URL到页面加载完成到底发生了什么?
    第5课 C语言指针深入1
  • 原文地址:https://www.cnblogs.com/aboutblank/p/3621604.html
Copyright © 2020-2023  润新知