每周一道算法题(三十一)

本周题目难度级别‘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循环效率更低。。。

版权声明:本文为 Crazy Steven 原创出品,欢迎转载,转载时请注明出处!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,779评论 18 399
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,593评论 25 708
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,779评论 0 33
  • 今日观点:自我成就感的对立面是自我挫败感。 思考:自我成就感越强的人,自我挫败感也就越强。这也正是为什么有人走极端...
    杨雪雪阅读 212评论 0 0
  • 灯火阑珊静谧处 执伞 等一个正确的未归人
    清宵雨淅淅阅读 259评论 0 1