自学内容网 自学内容网

计算机低能儿从0刷leetcode | 38.外观数列

题目:38. 外观数列

思路:这一题感觉仅仅难在了阅读理解上,搬了评论里一位朋友的中译中:

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

一步一步来

  1. 给一个数,这个数是1
  2. 描述上一步的数,这个数是 1 即一个1,故写作11
  3. 描述上一步的数,这个数是11即两个1,故写作21
  4. 描述上一步的数,这个数是21即一个2一个1,故写作12-11
  5. 描述上一步的数,这个数是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)!