• LeetCode(38): 报数


    Easy!

    题目描述:

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

    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 ,输出报数序列的第 n 项。

    注意:整数顺序将表示为一个字符串。

    示例 1:

    输入: 1
    输出: "1"
    

    示例 2:

    输入: 4
    输出: "1211"

    解题思路:

    题目描述的不是很清楚,其实就是第i+1个字符串是第i个字符串的读法,第一字符串为 “1”

    比如第四个字符串是1211,它的读法是 1个1、1个2,2个1,因此第五个字符串是111221。

    第五个字符串的读法是:3个1、2个2、1个1,因此第六个字符串是312211                  

    ......

    简单的模拟就可以。

    这道计数和读法问题还是第一次遇到,看似挺复杂,其实仔细一看,算法很简单,就是对于前一个数,找出相同元素的个数,把个数和该元素存到新的string里。

    C++解法一:

     1 class Solution {
     2 public:
     3     string countAndSay(int n) {
     4         if (n <= 0) return "";
     5         string res = "1";
     6         while (--n) {
     7             string cur = "";
     8             for (int i = 0; i < res.size(); ++i) {
     9                 int cnt = 1;
    10                 while (i + 1 < res.size() && res[i] == res[i + 1]) {
    11                     ++cnt;
    12                     ++i;
    13                 }
    14                 cur += to_string(cnt) + res[i];
    15             }
    16             res = cur;
    17         }
    18         return res;
    19     }
    20 }; 

    其实我们可以发现字符串中永远只会出现1,2,3这三个字符,假设第k个字符串中出现了4,那么第k-1个字符串必定有四个相同的字符连续出现,假设这个字符为1,则第k-1个字符串为x1111y。第k-1个字符串是第k-2个字符串的读法,即第k-2个字符串可以读为“x个1,1个1,1个y” 或者“*个x,1个1,1个1,y个*”,这两种读法分别可以合并成“x+1个1,1个y” 和 “*个x,2个1,y个*”,代表的字符串分别是“(x+1)11y” 和 "x21y",即k-1个字符串为“(x+1)11y” 或 "x21y",不可能为“x1111y”.

    比如将前12个数字打印一下,发现一个很有意思的现象,不管打印到后面多少位,出现的数字只是由1,2和3组成,网上也有人发现了并分析了原因 (http://www.cnblogs.com/TenosDoIt/p/3776356.html),前12个数字如下:

    1 1
    1
    2 1 1
    1 1 2 2 1
    1 2 2 1 1
    3 1 1 2 2 2 1
    1 1 3 2 1 3 2 1 1
    1 1 3 1 2 1 1 1 3 1 2 2 1
    3 2 1 1 3 1 1 1 2 3 1 1 3 1 1 2 2 1 1
    1 1 3 1 2 2 1 1 3 3 1 1 2 1 3 2 1 1 3 2 1 2 2 2 1
    1 1 3 1 1 2 2 2 1 2 3 2 1 1 2 1 1 1 3 1 2 2 1 1 3 1 2 1 1 3 2 1 1
  • 相关阅读:
    Java学习之集合(HashSet)
    Java学习之集合(LinkedList链表集合)
    Java学习之集合(List接口)
    Java学习之集合(Collection接口)
    【Spring Session】和 Redis 结合实现 Session 共享
    【NodeJS】nvm
    【Html JS】使用问题记录
    【VUE】使用问题记录
    【RabbitMQ】显示耗时处理进度
    【CentOS7】开发环境配置
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9138400.html
Copyright © 2020-2023  润新知