• 力扣(LeetCode)试题38-外观数列 C++代码(这个必须纪念一下)


    虽然解答时间比较长,但是还是有种满满的成就感。久违的感觉O(∩_∩)O~

    很容易想到递归算法,但是放到代码上还是不太会,有会的同学欢迎留言,感谢感谢

    我的方法用的迭代算法,比如求n=4时,先求n=1时,再把结果返回到n=2时,再把结果返回到n=3时,最后把结果返回n=4时,将n=4的结果返回,就完成了。

    分析题意,可知我们要得出的字符串,便是“个数”+“数字”的拼接。所以需要一个计数的变量 count,再需要一个索引变量 i 用以索取数字。

    整个程序使用两个循环,外循环迭代,即依次求k=1,2,3,…,n;内循环遍历上个n值的返回值known_result,并得到当前n值下的结果 result,若k不等于n,则把此result赋值给known_result,用于下个k值 之 内循环的遍历对象。

    带注释的代码如下:

     1 #include <iostream>
     2 #include <vector>
     3 #include <string>
     4 
     5 using namespace std;
     6 
     7 class Solution {
     8 public:
     9     string countAndSay(int n)
    10     {
    11         string result;
    12         string known_result;
    13         if (n == 1) result = "1";//n=1或2时,直接返回相应的值
    14         else{
    15             if (n == 2) result = "11";
    16             else// n >= 3时,将n=2的结果result作为已知值,赋值给known_result
    17             {
    18                 known_result = "11";
    19                 for (int k = 3; k <= n; k++)//外层循环,用于迭代n值,根据上一个k得到的known_result,求当前k的
    20                 {
    21                     int count = 1;//记录某元素出现的个数,初始值为1,因为某个值的数量必然至少为1
    22 
    23                     for (int i = 0; i < known_result.length() - 1; i++)//内循环,循环上一个k得到的known_result
    24                     {
    25                         //不用指向最后一个元素,这里的条件可以好好理解一下                    
    26                         if ((i == known_result.length() - 2) && (known_result[i] != known_result[i + 1]))
    27                         {
    28                             result += (to_string(count) + known_result[i]);
    29                             result += (to_string(1) + known_result[i + 1]);
    30                             break;
    31                         }
    32                         if ((i == known_result.length() - 2) && (known_result[i] == known_result[i + 1]))
    33                         {
    34                             count += 1;
    35                             result += (to_string(count) + known_result[i]);
    36                             break;
    37                         }
    38 
    39                         if ((i != known_result.length() - 2) && (known_result[i] == known_result[i + 1]))
    40                         {
    41                             count += 1;
    42                             continue;
    43                         }
    44                         result += (to_string(count) + known_result[i]); //拼接“数量”与“元素”,得到当前k值下的结果result
    45                         count = 1;//上一个相同元素个数完成,重新置1
    46                     }
    47 
    48                     known_result = result;//内循环结束,将当前k值下得到的结果,作为已知结果,用于下一个k值
    49                     result = "";//下一个k值下,result要清空
    50                 }
    51                 //ok,外循环结束了,即k=n了,那么k=n得到的已知结果,就是最终结果了,不再需要供别人遍历了
    52                 result = known_result;
    53             }
    54         }
    55         return result;//最后,将result值返回
    56     }
    57 };
    58 
    59 
    60 int main()
    61 {
    62     string result;
    63     Solution sol;
    64     int n = 5;
    65     result = sol.countAndSay(n);
    66 
    67     cout << result << endl;
    68     
    69     int u;
    70     cin >> u;
    71     return 0;
    72 }

  • 相关阅读:
    【Linux】在Linux上,使用校园出校器拨号的一个脚本。
    【Android】编译CM10.1遇到的错误解决方案
    【Android】编译CM10遇到的错误解决方案
    【Android】CM在repo中使用local manifest
    一个网站的诞生 MagicDict开发总结1 [首页]
    我记录网站综合系统 1.6发布
    带有ToolTip的ListBox
    字符串的宽度
    .NET开发的文本编辑器,(又发明轮子了,VB代码,不喜误入)
    捕获输入内容
  • 原文地址:https://www.cnblogs.com/pgzhanglin/p/13259362.html
Copyright © 2020-2023  润新知