今天分享一道很 rap 的算法题目。

题目来源于 LeetCode 上第 38 号问题:报数。题目难度为 Easy,目前通过率为 50.7% 。

题目描述

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

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 的评论区,绝大部分人都是在吐槽没看懂题目。题目的确比较绕,读了几篇才看明白。

题目讲的是后续的相应的 输出数字 依据的是它之前的 输出数字

  • 1:当它是 1 的时候,我们就返回字符串 '1'1

  • 2:当它是 2 的时候,我们就对之前的 1 报数,即 1 个111

  • 3:当它是 3 的时候,我们就对之前的 2 报数,即 2 个121

  • 4:当它是 4 的时候,我们就对之前的 3 报数,即 1 个 2 、1 个 11211

  • 5:当它是 5 的时候,我们就对之前的 4 报数,即 1 个 1 、1 个 2 、 2 个 1111221

  • 6:当它是 6 的时候,我们就对之前的 5 报数,即 3 个 1 、2 个 2 、1 个 1312211

  • 以此类推……

看懂了 题意,借助 递归 的概念,这道题的基本上就很好求解了。

动画描述

以报数字 6 为例。


代码实现

// c++
class Solution {
publicstring countAndSay(int n) {
        //递归终止的条件
        if(n == 1return "1";
        string prevResult = countAndSay(n-1);
        int count = 1;//计数
        string nowResult;//存放结果
        for(int i = 0 ; i < prevResult.length();i++){
            //统计有多少个相同数字
            if(prevResult[i] == prevResult[i+1]){
                count++;
                continue;
            }else{
                if( prevResult[i] != prevResult[i + 1]) {
                    nowResult += to_string(count) + prevResult[i];
                    //重置开始统计其他的数字
                    count = 1;
                }
            }
        }
       return nowResult;
    }
};



©著作权归作者所有:来自51CTO博客作者mb5fe18fab305a5的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. PHP使用递归按层级查找数据(代码详解)
  2. PHP递归算法的应用(含示例)
  3. 什么是php递归
  4. php递归经典案例
  5. PHP中的递归是什么?实现方式有哪些?
  6. 解答、收录了 8 道 MyBatis 的题目

随机推荐

  1. SharedPreference.Editor的apply和commit
  2. 图解Android View的scrollTo(),scrollBy(
  3. 为什么有的程序在64位机上跑反而比32位机
  4. Android Animation --- 无限360度旋转
  5. 给自己的项目做极光推送的步骤
  6. 如何为后台工作创建绑定服务(Xamarin)
  7. Android开发 处理拍照完成后的照片角度
  8. 关于android中sharedpreferences数据不更
  9. android面试题总结
  10. Android开发-直播视讯(3)-创建一个Ubuntu