计算机低能儿从0刷leetcode | 38.外观数列
题目: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
转换为对应的字符。
原文地址:https://blog.csdn.net/weixin_74314153/article/details/143714974
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!