【leetcode】报数(Python解答)

题目:

报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:

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

1 被读作  "one 1"  ("一个一") , 即 11
11 被读作 "two 1s" ("两个一"), 即 21
21 被读作 "one 2",  "one 1" ("一个二" ,  "一个一") , 即 1211

给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。

注意:整数顺序将表示为一个字符串。

 

示例 1:

输入: 1
输出: "1"

示例 2:

输入: 4
输出: "1211"

 

Python解答:

代码:

class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        answer=['开始','1','11','21','1211','111221']
        for i in range(5,31):
            lenth=len(answer[i])
            target=answer[i]+'*'#改造字符串,防止target[i+1]无法被查找
            j=0
            num=1
            Temp=''
            while j<lenth:          
                if target[j]==target[j+1]:
                    num=num+1#计数:记录连续相同数字的个数
                    j=j+1
                    continue#跳到下一次循环
                else:
                    value=target[j]#记录当前检验的数字的值
                    Temp=Temp+str(num)+str(value)#生成组成字符串的一部分
                    num=1#把计数器置为1
                    j=j+1
                    continue
            answer.append(Temp)
        return answer[n]

博主的效率逻辑清晰,代码移动,但效率很低:

还有很大的提升空间,下面是排行榜上两种效率较高的解答:

解答1:

class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        if n == 1: return '1'
        sour = '1'

        for i in range(n - 1):
            res = ''
            st = sour[0]
            cnt = 0
            for ss in sour + '.':
                if ss == st:
                    cnt += 1
                else:
                    res = res + str(cnt) + st
                    st = ss
                    cnt = 1
            sour = res
        return sour
        

解答2:

class Solution:
    def countAndSay(self, n):
        """
        :type n: int
        :rtype: str
        """
        res = '1'
        for _ in range(n - 1):
            cur = res[0]
            count = 0
            temp = ''
            for i in res:
                if i == cur:
                    count += 1
                else:
                    temp += str(count) + cur
                    cur = i
                    count = 1
            temp += str(count) + cur
            res = temp
        return res

 

C语言解答:

算法思路相同,需要主要的两点:

1.C语言中的字符串的拼接:

【头文件】#include <string.h>

【原型】:char *strcat(char *dest, const char *src);
【参数】: dest 为目标字符串指针,src 为源字符串指针。

参考:传送门

2.动态数组的申请

在stdlib.h中的malloc函数可用于动态内存分配,他的参数是需要分配的内存字节(字符)数

void *malloc(size);

 

在本题中的应用就是:

1 char* res =(char*)malloc((digitsSize+1)*sizeof(char));

代码:略

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值