题目:
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
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));
代码:略