38.报数

题目

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

  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"

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say

解答

  1. 直推法
    类似斐波拉契,知道前几项找关系得到后项
def countAndSay(n):
    if n == 1:
        res = '1'
    if n == 2:
        res ='11'

    pre = '11'
    for i in range(3, n+1):
        res = ''
        cnt = 1  #
        length = len(pre)  # 知道上一级的len,遍历每个字符才能得到下一级的res
        for j in range(1, length):  # use range(1,) other than range(0,) in case out of range
            if pre[j-1] == pre[j]:
                cnt += 1
                # res += str(cnt) + pre[j-1]
                # if this order exists,
                # the way to output last one(last two nums different)number
                # or both last two(last two nums same)numbers are different

            else:
                res += str(cnt) + pre[j-1]  # one x (x is the num should be transfer)
                cnt = 1
        res += str(cnt) + pre[j]  # must write this order beyond loop
        pre = res
    return res

其实中心思想就是分两种情况考虑,一种是相连的数相同,一种是相连的数不相同。下一个报数就是上一个报数的变形。如果一个报数中相邻两个数字不同,变形后原来两数会变成四个数;如果两数相同,变形后仍然是两位数,如果连续三数或者更多数相同,变形后维持两数。
如果相邻两数相同,cnt++,res里加上cnt和要变形的这个数;如果不同,cnt=1,res里加上cnt和要变形的数。
一开始有点没懂为什么在里面的for循环外要加上res += str(cnt) + pre[j-1]而在pre[j-1] == pre[j]:中不加上这句话。
这主要针对最后两个数字。
若最后两数不同,则最后一个数(1)在for循环外变形(one 1)-> ‘11’;
若最后两(多)数相同,则最后两(多)个数在for循环内增加cnt的值,然后在for循环外一起变形。

  1. 递归
    每一个countAndSay(n)会得到一个报数,然后被下一个countAndSay(n+1)使用。
    def countAndSay(self, n: int) -> str:
        if n == 1:
            return '1'
        # 每次迭代都要初始化pre cnt res
        pre = ''      # 设初值,第一个数无法判断和后面的数是否相等
        cnt = 0       # 则第一个数字是和空字符比较,因为前方没有数字能比较
        res = ''

        for num in self.countAndSay(n-1):
            if num != pre:  # 比较后一个数字和前一个数字是否相等
                if cnt > 0:
                    res += str(cnt) + str(pre)
                cnt = 1  # 除了num = 第一个数时cnt = 0,其他时候都 = 1
                pre = num  # pre变成等会要变形数字的上一个数字
            else:
                cnt += 1
        res += str(cnt) + str(pre)  # 为了最后一个数或两个数的变形
        return res
  1. groupby方法
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,922评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,591评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,546评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,467评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,553评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,580评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,588评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,334评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,780评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,092评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,270评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,925评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,573评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,194评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,437评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,154评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,127评论 2 352

推荐阅读更多精彩内容

  • 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1 11 21 1211 11...
    FiveZM阅读 582评论 0 0
  • 报数 题目 报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下: 1 11 21 1...
    饮酒醉回忆阅读 189评论 0 1
  • LeetCode 38. 报数 链接https://leetcode-cn.com/problems/count-...
    Jaxon张阅读 637评论 0 2
  • 今天心绪很坏。 写下这句又觉得可笑。好像这些日子也没几天心绪好的。 怎么能好呢,毕竟我是个失业的人。 但再往前看,...
    柒月的可可阅读 183评论 0 2
  • 子曰:“富而可求也,虽执鞭之士,吾亦为l之。如不可求,从吾所好。 哈皮波白话试译: 孔子讲:“富贵如果是可以追求到...
    哈皮波阅读 889评论 0 0