zoukankan      html  css  js  c++  java
  • Reverse Words in a String

    question:

    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 class Solution {
     2 public:
     3     void reverseWord(string &s,int b,int e)   //将字符串s中b-e之间的字串翻转
     4     {
     5         char temp;
     6         while(b<e)
     7         {
     8             temp=s[b];
     9             s[b]=s[e];
    10             s[e]=temp;
    11             b++;
    12             e--;
    13         }
    14     }
    15     void removeSpace(string &s)    //去除字符串s首尾的空格,并将字符串中连续的多个空格变为一个
    16     {
    17         int i,j;
    18         i=j=0;
    19         int e=s.size();
    20         while(i<e&&s[i]==' ' ) i++;    //去除字符串首部的空格,注意两个条件不能颠倒,因为s[e]超出字符串范围,会出错
    21         if(i==e) {s.clear();return;}     //当i==e时,表示字符串中只有空格,置原字符串为空
    22         while(s[e-1]==' ') e--;  //去除尾部的空格
    23         while(i<e)  
    24         {
    25             s[j]=s[i];
    26             i++;
    27             while(i<e&&s[j]==' '&&s[i]==' ') i++;  //去除连续的多个空格,若s[j]为空格,则下一位不能再为空格
    28             j++;
    29             if(i==e) break;
    30         }
    31         s.resize(j);
    32     }
    33     void reverseWords(string &s) {
    34         removeSpace(s);
    35         if(s.empty()||s.size()==1)return;    //空字符串和长度为一的字符串不做处理
    36         int b=0;
    37         int e=s.size()-1;    
    38         reverseWord(s,b,e);    //去除空格后的字符串整体翻转
    39         b=e=0;
    40         while(b!=s.size()-1)   //将每个单词翻转
    41         {
    42             if(s[b]==' ')
    43             {
    44                 b++;
    45                 e++;
    46                 continue;
    47             }
    48             else if(s[e]==' '||e==s.size()-1)
    49             {
    50                 if(e==s.size()-1)    //用if语句分开处理的原因是e不能为s.size(),否则s[e]越界
    51                 {
    52                     reverseWord(s,b,e);
    53                     break;
    54                 }
    55                 else
    56                 reverseWord(s,b,e-1);            
    57                 b=e;
    58             }
    59             else
    60                 e++;
    61         }
    62     }
    63 };

    注:区分string类型和char *类型(字符数组),对于string类型的数据,用str[str.size()]!=‘'作为条件语句会出错,而char *类型不会

    如:

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 void main()
     5 {
     6     string str="hello";
     7     int i=0;
     8     while(str[i]!='')
     9     cout<<str[i++];
    10 }

    程序报错:越界

     1 #include<iostream>
     2 #include<string>
     3 using namespace std;
     4 void main()
     5 {
     6     char *str="hello";
     7     int i=0;
     8     while(str[i]!='')
     9     cout<<str[i++];
    10 }

    运行成功:

  • 相关阅读:
    Asp.net Core依赖注入(Autofac替换IOC容器)
    .NET Core WEB API接口参数模型绑定
    .net core docker容器编排部署(linux)
    asp .net core发布订阅kafka
    asp.net Core依赖注入(自带的IOC容器)
    VS2017 GIT推送错误:Authentication failed解决办法
    《ASP.NET Core 开发实战》
    《Entity Framework 实用精要》
    《C# 敏捷开发实践》
    《ASP.NET 框架应用程序实战》
  • 原文地址:https://www.cnblogs.com/mrlsx/p/5435140.html
Copyright © 2011-2022 走看看