zoukankan      html  css  js  c++  java
  • 【LeetCode】Reverse Words in a String 反转字符串中的单词

    一年没有管理博客园了,说来实在惭愧。。

    最近开始刷LeetCode,之前没刷过,说来也实在惭愧。。。

    刚开始按 AC Rates 从简单到难刷,觉得略无聊,就决定按 Add Date 刷,以后也可能看心情随便选题…(⊙o⊙)…今天做了14年 Add 的三个题,其中 Maximum Product Subarray 着实把我折腾了好一会儿,所以想想还是跟大家分享一下我的解法,也或许有更好的方法,期待大家的分享。就把三个题按 Add Date 的先后顺序分享一下吧。

    Add Date 2014-03-05

    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.

    单纯把 "the sky is blue" reverse 成 "blue is sky the" 是件很容易的事情,也是比较经典的题目,不过本题说:

    1. s 中的开头和结尾有可能有空格,reverse 后的 string 中要去掉;

    2. 连续多个空格要变成一个空格。

    我的 code 略折腾,用了两个函数:

    1. reverseWord 实现最基本的 reverse,首先整个 reverse,变为“eulb si yks eht”,然后每个 word reverse,遍历两边即可。

    2. removeSpace 实现检查和删除空格。遍历一遍即可。

    复杂度O(n).

    附 code,仅供参考。

     1 class Solution {
     2 public:
     3     void reverseWord(string &s) {                       //反转字符串
     4         string::iterator pre = s.begin();
     5         string::iterator post = s.end()-1;
     6         char tmp;
     7         while(pre < post) {                             //反转整个字符串
     8             tmp = *pre;
     9             *pre = *post;
    10             *post = tmp;
    11             ++pre;
    12             --post;
    13         }
    14         pre = s.begin();
    15         post = pre;
    16         while(post != s.end()) {                        //反转每个单词
    17             while(pre != s.end() && *pre == ' ') {
    18                 ++pre;
    19             }
    20             if(pre == s.end())
    21                 return;
    22             post = pre;
    23             while(post != s.end() && *post != ' ') {
    24                 ++post;
    25             }
    26             --post;
    27             if(post != s.end() && pre < post) {
    28                 string::iterator p1 = pre;
    29                 string::iterator p2 = post;
    30                 while(p1 < p2) {
    31                     tmp = *p1;
    32                     *p1 = *p2;
    33                     *p2 = tmp;
    34                     ++p1;
    35                     --p2;
    36                 }
    37             }
    38             ++post;
    39             pre = post;
    40         }
    41     }
    42     
    43     void removeSpace(string &s) {                       //检查和删除空格
    44         string::iterator pre = s.begin();
    45         string::iterator post = pre;
    46         while(pre != s.end() && *pre == ' ') {          //删除开头的空格
    47             s.erase(s.begin());
    48             pre = s.begin();
    49         }
    50         if(pre == s.end())
    51             return;
    52         post = pre;
    53         while(post != s.end()) {                        //把连续多个空格变为一个
    54             while(pre != s.end() && *pre != ' ')
    55                 ++pre;
    56             if(pre == s.end())
    57                 return;
    58             post = pre+1;
    59             while(post != s.end() && *post == ' ') {
    60                 s.erase(post);
    61                 post = pre+1;
    62             }
    63             ++pre;
    64         }
    65         if(!s.empty()) {                                //如果最后有空格则删除
    66             pre = s.end()-1;
    67             if(*pre == ' ')
    68                 s.erase(pre);
    69         }
    70     }
    71     
    72     void reverseWords(string &s) {
    73         reverseWord(s);
    74         removeSpace(s);
    75     }
    76 };
    View Code
  • 相关阅读:
    C/C++ 获取线程入口地址模块等
    C/C++ IAT HOOK MessageBoxW
    C/C++ HOOK 全局 API
    c/c++创建静态库
    如何画Windows窗体
    WindowsPE TLS表
    WindowsPE 延迟加载导入表
    WindowsPE 资源表
    WindowsPE 重定位表
    WindowsPE 导出表
  • 原文地址:https://www.cnblogs.com/shirley130912/p/4029835.html
Copyright © 2011-2022 走看看