Day12-外观数列

题目

Leetcode38-外观数列
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题解

这道题看了好久才看懂,什么意思呢?
我们来逐层看,每一层都是对上一层的解释
如:

  • 第一层就是1
  • 第二层是用来解释“一个1”的,那么“一个1”就表示为11
  • 第三层解释11,11是“两个1”,表示为21
  • 第四层解释21,即“一个2”“一个1”,表示为12 11
  • 第五层解释1211,即“一个1”“一个2”“两个1”,表示为11 12 21
  • 以此类推…

这道题就是要给出第几层,让你输出这一层对上一层的解释

 

C++

之前本来是想用vector< string >来存放每一层的“解释”的,但是后来发现这样不仅麻烦,而且还占用了不必要的空间

要求这一层的“解释”,只需要知道他上一层的就好了,所以,其实只需要两个字符串就行了,不需要字符串数组,代码中string res存的是上一层的“解释”,string temp存放本层的“解释”

class Solution {
public:
    string countAndSay(int n) {
        string res="1";//res初始化:第一层的“解释”

        //i来遍历每一层
        for(int i=1;i<n;i++)
        {
            int count=1;
            string temp="";
            //j来遍历上一层“解释”的每一位
            for(int j=0;j<res.size();j++)
            {
                //count用来计数“相同连续”的数字
                if(res[j]==res[j+1])
                {
                    count++;
                }
                else
                {
                    //count+res[j],即“几个几”,装入“解释”
                    temp+=to_string(count)+res[j];//count是int型,注意要转成string
                    count=1;//count置1,为下一次计数做准备
                }
            }
            res=temp;
            temp="";
        }
        return res;
    }
};

 

python

c++和python的区别总是让人猝不及防,最开始写python是照搬的c++代码,结果就会报这个错误

IndexError: string index out of range
Line 9 in countAndSay (Solution.py)

原因是比如你声明了一个长度为10的数组a[10],c++ 中a[10]是’\0’是没问题的,但是 python 不以’\0’为结尾,所以在python中a[10]就会报数组超限,即上面那个错误
 
我的解决方法是把a[10]单拎出来,代码如下:

class Solution:
    def countAndSay(self, n: int) -> str:
        res="1"
        for i in range(n-1):
            count=1
            temp=""
            
            for j in range(len(res)):
                # 增加临界情况
                if j!=len(res)-1 and res[j]==res[j+1]:
                    count+=1
                else:
                    temp+=str(count)+res[j]
                    count=1
            res=temp
            temp=""
        
        return res

以上,两种语言时间复杂度都是O(n2)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值