题目:38. 外观数列
思路:这一题感觉仅仅难在了阅读理解上,搬了评论里一位朋友的中译中:
1
11
21
1211
111221
一步一步来
- 给一个数,这个数是1
- 描述上一步的数,这个数是 1 即一个1,故写作11
- 描述上一步的数,这个数是11即两个1,故写作21
- 描述上一步的数,这个数是21即一个2一个1,故写作12-11
- 描述上一步的数,这个数是1211即一个1一个2两个1,故写作11-12-21
可见这仅仅是一个简单的递归,只需要把n-1的字符串转换一下就可以得到n的字符串,具体如下:
1、我们遍历n-1的结果str_old,当有连续重复字符时就计数,然后把这个计数count和这个重复字符都加入到新的字符串str_res中;如果只有单个字符不重复,那就把计数count=1和这个字符加入到str_res中即可。
代码:
class Solution {
public:string Rle(int n){if(n==1) return "1";string str_old=Rle(n-1);string str_res="";int i=0,len=str_old.length();while(i<len){int count=1;while(i<len-1&&str_old[i]==str_old[i+1]){count++;i++;}// str_res.push_back((char)count);str_res.push_back('0' + count); str_res.push_back(str_old[i]);i++;}return str_res;}string countAndSay(int n) {return Rle(n);}
};
注意:这里的要点是代码中注释的那一行,我尝试用push_back
操作将一个字符添加到字符串 str_res
中,而 (char)count
并不是一个可打印的字符(它是整数 count
的字符表示)。当我将 count
强制转换为字符时,它会将 count
的值视为 ASCII 码的字符值,而不是数字 1
的字符,导致结果错误。所以应该使用'0' + count
来将 count
转换为对应的字符。