题目描述:
报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数。如下所示:
1, 11, 21, 1211, 111221, ...
1
读作 "one 1"
-> 11
.
11
读作 "two 1s"
-> 21
.
21
读作 "one 2, then one 1"
-> 1211
.
给定一个整数 n
, 返回 第 n
个顺序。
注意事项
整数的顺序将表示为一个字符串。
给定 n = 5
, 返回 "111221"
.
其实这道题最难得是不好理解,先看下面的规律:
- n = 1,result = "1",这是初始数据
- n = 2,result = "11",意味着上一个报数的结果是 "1个1"
- n = 3,result = "21",意味着上一个报数的结果是 "2个1"
- n = 4,result = "1211",意味着上一个报数的结果是 "1个2、1个1"
- n = 5,result = "111221",意味着上一个报数的结果是 "1个1、1个2、2个1"
实现代码:
#include <iostream>
using namespace std;
string reportCount(int n) {
// write your code here
if (n <= 0) {
return string("");
}
string result("1");//初始值 装每次遍历后的值
for (int i = 1; i < n; i++) {//按从1到n来遍历每次产生的值
string temp;
int count = 1, j;
for (j = 0; j < result.size() - 1; j++) {
if (result[j] == result[j + 1]) { //count统计上次值相等的个数
count++;
}
else{
temp += ('0' + count);//如果不重复 则1个result[j]
temp += result[j];
count = 1;
}
}
if (j > 0 && result[j] == result[j - 1]) { //temp临时结果保存count数和具体重复值
temp += ('0' + count);
temp += result[j];
}
else if (j == 0) {//针对第一次初始值做操作1个1
temp += '1';
temp += result[j];
}
else {
temp += '1';//针对最后一个数做1个result[j] 追加到temp上
temp += result[j];
}
result = temp;
}
return result;
}
int main(int argc, const char * argv[]) {
// insert code here...
std::cout << "Hello, World!\n";
string value = reportCount(4);
return 0;
}