LeetCode38. Count and Say-python(easy)

题目来源:

     https://leetcode.com/problems/count-and-say/description/

题目分析:

   首先,题目告诉我们count and say是这样的序列:

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

它是这样计算的,比如第一个数是1,则第二个数是个数加上数字,也就是一个1,所以是11;同理,第三个数字是第二个数字从左往右的个数加上数字,则为2个1,所以是21;第四个数字是第三个数字从左往右的个数加上数字,则第三个数字里面的2表示为1个2,第三个数字里的1表示为1个1,所以第四个数字为1211...以此类推。现在题目给一个整数n,要我们输出此时的count and say序列。因为要求n=5时,需要知道n=4的序列,而n=4的序列是由于n=3的序列来求出...由此我们可以想到先定义一个函数,使它输入一个字符串时,可以得到它的下一个字符串,然后在主函数中循环n次即可。需要注意的是,题目要求该整数序列用字符串表示。

解题代码:

class Solution:
    def countstr(self,s):
        count=0;tmp=s[0];x=""
        for i in range(len(s)):
            if(s[i]==tmp):%此时的比较是前后2个数字进行比较看它们是否相等
                count=count+1
            else:
                x+=str(count)+tmp
                tmp=s[i];count=1
        x+=str(count) + tmp   %%循环后之所以要加一个是指最后一个数字
        return x

    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        ans='1'%起始从'1'开始
        while(n>1):
            ans=self.countstr(ans)
            n-=1
        return ans

同样的思路,写在一个函数里,则是双重循环。

class Solution(object):
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        s = '1'
        for i in range(n-1):
            count = 1
            temp = []
            for index in range(1, len(s)):
                if s[index] == s[index-1]:
                    count += 1
                else:
                    temp.append(str(count))
                    temp.append(s[index-1])
                    count = 1
            temp.append(str(count))
            temp.append(s[-1])
            s = ''.join(temp)  %%该函数用于连接字符串
        return s

还可以递归来进行运算:

class Solution(object):
    def countAndSay(self, n):
        if n == 1: return "1"
        s = self.countAndSay(n-1)
        i, ch, tmp = 0, s[0], ''
        for j in range(1, len(s)):
            if s[j] != ch:
                tmp += str(j-i) + ch
                i, ch = j, s[j]
        tmp += str(len(s)-i) + ch
        return tmp









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值