38. Count and Say

The count-and-say sequence is the sequence of integers with the first five terms as following:

1.     1
2.     11
3.     21
4.     1211
5.     111221

1 is read off as "one 1" or 11.
11 is read off as "two 1s" or 21.
21 is read off as "one 2, then one 1" or 1211.

Given an integer n, generate the nth term of the count-and-say sequence.

Note: Each term of the sequence of integers will be represented as a string.

Example 1:

Input: 1
Output: "1"

Example 2:

Input: 4
Output: "1211"

看到这个题的时候有点蒙圈,不知道是要干啥。。。让我来简单粗暴的翻译一下吧。

当n == 1的时候,字符串是“1”,读作“一个1”, 写作“11” (第一个1表示数量,第二个1表示数字,加起来就是一个1),于是有了下一个字符串;

当n == 2的时候,字符串是“11”,读作“两个1”,写作“21”

当n == 3的时候,字符串是“21”, 读作“一个2一个1”,写作“1211”

以此类推。

这个题没啥说的就是统计上一个字符串中同样数字出现的次数,我使用了两根指针的思路。

代码如下:

class Solution {
public:
    string countAndSay(int n) {
        string oldNum = "1";
        if (n == 1) return oldNum;
        for (int i = 2; i <= n; i++) {
            int start = 0;
            string newNum = "";
            while (start < oldNum.length()) {
                int numberLen = 0;
                int end = start;
                while (end < oldNum.length() && oldNum[start] == oldNum[end]) {
                    numberLen++;
                    end++;
                }
                newNum += '0' + numberLen;
                newNum += oldNum[start];
                start = end;
                
            }
            oldNum = newNum;
        }
        return oldNum;     
    }
};
做这个题的过程中发现了自己知识的一个漏洞,那就是十分简单的char转换为string,居然想了半天。-.-

其实只要简单相加即可:

char c = 'a';
string s = "hello world";
cout << s + c << endl;


呵呵。。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值