LintCode 第420题 报数

题目描述:

报数指的是,按照其中的整数的顺序进行报数,然后得到下一个数。如下所示:

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"
其实初始就是把1念成1个1,"11"的话念成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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值