虽然解答时间比较长,但是还是有种满满的成就感。久违的感觉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 }