美文网首页
每日一题篇 — leetcode38号题外观数列

每日一题篇 — leetcode38号题外观数列

作者: 一盘好书 | 来源:发表于2020-05-13 10:08 被阅读0次

38. 外观数列

所谓外观数列,就是后一个数列是对前一个数列的描述。打个比方:

序列号1:  1        
序列号2:  11      这是对上一个数据1的描述,上一个数据为1个1,记做:11.
序列号3:  21      这是对上一个数据11的描述,上一个数据为2个1,记做:21.
序列号4:  1211    这是对上一个数据21的描述,上一个数据为1个2,1个1,记做:1211.
...

题目是,给出相应的序列号,算出对应的外观数列。

要找序列号为n的外观数列,那么就得知道序列号为n-1的外观数列的值,要想知道序列号为n-1的外观数列的值,就得知道序列号为n-2的外观数列的值...

以此类推,很容易联想到用递归,而递归的终止条件可以是以下两个:

if (n == 1) return "1";

if (n == 2) return "11";

这样做就能保证preString的长度至少大于等于2,不用做额外的判断。preString代表上一个外观数列的值,在下面的代码中会提到。

然后,两指针最初分别指向外观数列中第0位和第1位,当指向的元素相同时,right指针向前移动一位,否则添加对应元素。

leftright指针的差值就是某个数字的出现的次数。

    // 递归算法
    private String getStringByCount(int n) {
        if (n == 1) return "1";

        if (n == 2) return "11";
        // 递归计算前一个元素的值 
        char[] preString = getStringByCount(n - 1).toCharArray();

        int left = 0;
        StringBuilder result = new StringBuilder();

        for (int right = 1; right < preString.length; ) {
            // 不同位上的元素不一样
            if (preString[left] != preString[right]) {
                // 开始构建描述数列,此时right - left代表着中间隔了多少个相同的元素
                result.append((right - left)).append(preString[left]);
                left = right;
            }
            // 每个遍历,right右移一位
            right++;
            // 当达到元素的末尾时
            if (right == preString.length) {
                result.append((right - left)).append(preString[left]);
            }

        }

        return result.toString();
    }

相关文章

  • 每日一题篇 — leetcode38号题外观数列

    38. 外观数列 所谓外观数列,就是后一个数列是对前一个数列的描述。打个比方: 题目是,给出相应的序列号,算出对应...

  • LeetCode 每日一题 [24] 外观数列

    LeetCode 外观数列 [简单] 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描...

  • 数据结构算法基础

    算法基础 一、基础算法 字符串处理 LeetCode38 外观数列 LeetCode49 字母异位词分组 对字母...

  • Day 4 Project 我的微信好友

    附:每日一题

  • java 常用知识点链接

    java面试公众号每日一题 final , finally, finalize() 界面原型设计 Java 集合列...

  • Python小白 Leetcode刷题历程 No.36-N

    Python小白 Leetcode刷题历程 No.36-No.40 有效的数独、解数独、外观数列、组合...

  • 周末作业(一)

    @author 小焕哥 第一题 1斐波那契数列指的是这样一个数列 1, 1, 2, 3, 5, 8, 13, 2...

  • 外观数列

    LeetCode第38题 题目描述:「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述...

  • 外观数列

    一、问题 给定一个正整数 n ,输出外观数列的第 n 项。「外观数列」是一个整数序列,从数字 1 开始,序列中的每...

  • 外观数列

    给定一个正整数 n ,输出外观数列的第 n 项。 「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是...

网友评论

      本文标题:每日一题篇 — leetcode38号题外观数列

      本文链接:https://www.haomeiwen.com/subject/pjbgnhtx.html