本周题目难度级别‘Easy’,使用语言:Python
题目:给你一个集合的规则,让你找出这个集合的第N个数字。
- 集合规则:第一个数是1,以后每个数是前一个数的读法,个数在前,数字在后。
- 例如:
- 第一个数是1;
- 第二个数是11(前一个数的读法,1个1);
- 第三个数是21(前一个数的读法,2个1);
- 第四个数是1211(1个2,1个1)
- 第五个数是111221(1个1,1个2,2个1);
- 第六个数是312211(3个1,2个2,2个1);
- 第七个数是13112221(1个3,1个1,2个2,2个1);
- 。。。
思路:不知道我这个题目写的清不清楚,因为我当时是搞了好久才明白题目的,明白了题目这题就很好做了,毕竟是'Easy'级别的题目。思路其实就是一个一个读么,你要第几个数我就读到第几个数给你。。。
下面给两组代码:
第一组:
class Solution(object):
def countAndSay(self, n):
"""
:type n: int
:rtype: str
"""
if (n == 1):
return "1";
result = '11';
while(n != 2):
#初始化两个容器,nums是数字,count是数字的个数
nums=list(result[0]);
count=list('1');
#开始从左至右解读result
for i in range(1,len(result)):
#如果和前面一个数字一样就只要将个数+1
if result[i]==result[i-1]:
count[-1]=str(int(count[-1])+1);
else:
#不一样就分别在nums里记录数字,初始化个数为1
nums += result[i];
count += '1';
result ='';
#重置result
for x,y in zip(count,nums):
result = result + x + y;
n -= 1;
return result;
第二组:
class Solution(object):
def countAndSay(n):
"""
:type n: int
:rtype: str
"""
if (n == 1):
return "1";
result = '11';
while (n != 2):
temp = list('1') + list(result[0]);
for i in range(1, len(result)):
#如果和前面一个数字一样就只要将个数+1
if result[i] == result[i - 1]:
temp[-2] = str(int(temp[-2]) + 1);
else:
#不一样就分别在记录数字,初始化个数为1
temp = temp + list('1') + list(result[i]);
result = ''.join(temp);
n -= 1;
return result;
来说说两组代码,一开始我是写的第一组,效率中等偏下,然后我想是不是因为for循环用的太多,于是就有了第二组,for循环虽然少了,但格式转换多了,通过python的魔术命令测试,发现第二组的效率比第一组效率还低。。。好吧,格式转换比for循环效率更低。。。