• 剑指offer系列34:翻转单词顺序


    我看到这个题目的第一想法是,按照空格把字符串分开,然后把被分开的字符串压栈。再把栈里的内容弹出组成一个字符串就可以。但是答案直接先翻转整个字符串,然后按照空格为分割翻转单个单词。这个方案不需要额外的空间。

     1 class Solution {
     2 public:
     3     string ReverseSentence(string str) {
     4 
     5         Reverse(str,0,str.size()-1);
     6         int count = 0;//给空格计数
     7         for (int i=0,j=1; i<str.size(), j<str.size(); j++)
     8         {
     9             if (str[j] == ' ')
    10             {
    11                 count++;
    12                 if (i == j)
    13                 {
    14                     i = j + 1;
    15                 }
    16                 else {
    17                     Reverse(str, i, j-1);
    18                     i = j + 1;
    19                 }
    20             }
    21         }
    22         if (count == 0)
    23         {
    24             Reverse(str, 0, str.size() - 1);
    25             return str;
    26 
    27         }
    28         else {//如果空格数大于0,则要翻转最后一个单词,前面的for循环只能翻转空格前面的单词
    29             for (int i = 0; i < str.size(); i++)
    30             {
    31                 if (str[i] == ' ')
    32                 {
    33                     count--;
    34                     if(count==0)
    35                         Reverse(str, i+1, str.size() - 1); 
    36                 }
    37                 
    38             }
    39             return str;
    40         }
    41 
    42 
    43     }
    44     void Reverse(string &str,int start,int end)
    45     {
    46         if (str.empty())
    47             return;
    48         for (;start<end;start++,end--)
    49         {
    50             swap(str[start],str[end]);
    51         }
    52     }
    53 };

    左旋转字符串:举例(abcdefg),n=3;分为两部分,abc和defg。然后分别对两部分旋转得到cba和gfed。总体就是cbagfed,然后对整个字符串翻转。得到defgabc。想清楚算法在写就很简单了,主要要把这个题和上一个结合起来。

     1 class Solution {
     2 public:
     3     string LeftRotateString(string str, int n) {
     4         if (str.empty() || n < 1)
     5             return str;
     6         Reverse(str, 0, n - 1);
     7         Reverse(str,n,str.size()-1);
     8         Reverse(str, 0, str.size() - 1);
     9         return str;
    10     }
    11     void Reverse(string &str, int start, int end)
    12     {
    13         if (str.empty())
    14             return;
    15         for (; start < end; start++, end--)
    16         {
    17             swap(str[start], str[end]);
    18         }
    19     }
    20 };
  • 相关阅读:
    关于产品那些事
    关于“编程的本质”的探讨
    分享一款在线贝塞尔曲线调试器
    HTML、CSS、JS对unicode字符的不同处理
    HTTP Content-Disposition Explanation [ from MDN ]
    认证 (authentication) 和授权 (authorization) 的区别
    事件驱动引擎会取代多线程编程吗
    你所不知道的JSON
    都有哪些特殊而实用的的搜索引擎?
    巨头们的GitHub仓库整理
  • 原文地址:https://www.cnblogs.com/neverland0718/p/11209293.html
Copyright © 2020-2023  润新知