风雨雾凇 风雨雾凇
首页
  • 服务端

    • golang
  • 其他

    • leetcode
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

风雨雾凇

技术小渣渣
首页
  • 服务端

    • golang
  • 其他

    • leetcode
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
关于
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • golang

  • 技术文档

  • GitHub技巧

  • Nodejs

  • 博客搭建

  • leetcode

    • 两数之和-1
    • 无重复字符的最长子串-3
    • 整数翻转-7
    • 回文数-9
    • 13-罗马数字转整数
    • 最长公共前缀
    • 3Sum
    • Valid Parentheses
    • Merge Two Sorted Lists
    • Remove Duplicates from Sorted Array
    • Remove Element
    • Implement strStr()
    • Search Insert Position
    • Count and Say
      • 字符串相乘
      • Maximum Subarray
      • Length of Last Word
      • Plus One
      • Add Binary
      • Sqrt(x)
      • 翻转字符串里的单词
      • 字符串的排列
    • 机器学习

    • 技术
    • leetcode
    风雨雾凇
    2020-02-16
    目录

    Count and Say

    # 题目

    The count-and-say sequence is the sequence of integers with the first five terms as following:
    
    1.     1
    2.     11
    3.     21
    4.     1211
    5.     111221
    1 is read off as "one 1" or 11.
    11 is read off as "two 1s" or 21.
    21 is read off as "one 2, then one 1" or 1211.
    
    Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
    
    Note: Each term of the sequence of integers will be represented as a string.
    
     
    
    Example 1:
    
    Input: 1
    Output: "1"
    Explanation: This is the base case.
    Example 2:
    
    Input: 4
    Output: "1211"
    Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/count-and-say
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    # 解答思路

    先理解题意:

    # 设函数为fn(x) 其本意为解释int类型每个数的个数和顺序
    fn(1) => "1"  # 固定值返回1
    fn(2) => fn(fn(1)) => fn("1") => "11" # 1个1
    fn(3) => fn(fn(2)) => fn("11") => "21" # 2个1
    fn(4) => fn(fn(3)) => fn("21") => "1211" # 1个2 1个1
    fn(5) => fn(fn(4)) => fn("1211") => "111221" # 1个1 1个2 2个1
    ...
    
    1
    2
    3
    4
    5
    6
    7

    故明显需使用递归来进行,找到递归出口并按照规则返回即可。

    golang注意语法,string进行切片本质为[]rune{...}

    # 代码

    package easy
    
    import (
    	"bytes"
    	"strconv"
    	"testing"
    )
    
    /**
    The count-and-say sequence is the sequence of integers with the first five terms as following:
    
    1.     1
    2.     11
    3.     21
    4.     1211
    5.     111221
    1 is read off as "one 1" or 11.
    11 is read off as "two 1s" or 21.
    21 is read off as "one 2, then one 1" or 1211.
    
    Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
    
    Note: Each term of the sequence of integers will be represented as a string.
    
    
    
    Example 1:
    
    Input: 1
    Output: "1"
    Explanation: This is the base case.
    Example 2:
    
    Input: 4
    Output: "1211"
    Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
    
    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/count-and-say
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
    */
    
    func countAndSay(n int) string {
    	// 递归出口
    	if n == 1 {
    		return "1"
    	}
    	// 上一个递归结果
    	lastRes := countAndSay(n - 1)
    	var sameTimes, lastIndex int
    	var res bytes.Buffer
    	for i := 0; i < len(lastRes); i++ {
    		if lastRes[i] == lastRes[lastIndex] {
    			sameTimes++
    		} else {
    			res.WriteString(strconv.Itoa(sameTimes))
    			res.WriteRune(rune(lastRes[lastIndex]))
    			sameTimes = 1
    			lastIndex = i
    		}
    	}
    	if sameTimes != 0 {
    		res.WriteString(strconv.Itoa(sameTimes))
    		res.WriteRune(rune(lastRes[lastIndex]))
    	}
    	return res.String()
    }
    
    func TestCountAnySay(t *testing.T) {
    	println(countAndSay(5))
    }
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    编辑 (opens new window)
    #面试#学习笔记#leetcode
    上次更新: 2023/02/17, 16:53:03
    Search Insert Position
    字符串相乘

    ← Search Insert Position 字符串相乘→

    最近更新
    01
    builtin
    02-12
    02
    导读
    02-12
    03
    13-罗马数字转整数
    01-30
    更多文章>
    Theme by Vdoing | Copyright © 2017-2023 风雨雾凇 | 粤ICP备16018321号-2
    博客内容遵循署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 协议
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式