力扣(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 }

 

 

posted @ 2020-07-07 10:32  ZyLin-ux  阅读(317)  评论(0编辑  收藏  举报