首页 > 其他分享 >外观数列

外观数列

时间:2023-06-15 14:39:31浏览次数:30  
标签:11 外观 数字 21 countAndSay 字符串 描述 数列


外观数列

题目:
给定一个正整数 n ,输出外观数列的第 n 项。

「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。

你可以将其视作是由递归公式定义的数字字符串序列:

countAndSay(1) = “1”
countAndSay(n) 是对 countAndSay(n-1) 的描述,然后转换成另一个数字字符串。
前五项如下:

1
11
21
1211
111221

第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 “11”
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 “21”
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 “1211”
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 “111221”
要 描述 一个数字字符串,首先要将字符串分割为 最小 数量的组,每个组都由连续的最多 相同字符 组成。然后对于每个组,先描述字符的数量,然后描述字符,形成一个描述组。要将描述转换为数字字符串,先将每组中的字符数量用数字替换,再将所有描述组连接起来。

例如,数字字符串 “3322251” 的描述如下图:

外观数列_System


示例 1:

输入:n = 1
输出:“1”
解释:这是一个基本样例。
示例 2:

输入:n = 4
输出:“1211”
解释:
countAndSay(1) = “1”
countAndSay(2) = 读 “1” = 一 个 1 = “11”
countAndSay(3) = 读 “11” = 二 个 1 = “21”
countAndSay(4) = 读 “21” = 一 个 2 + 一 个 1 = “12” + “11” = “1211”

解题思路:一开始用递归做,结果超时了,所以用打表做了

class Solution {
    
    private static String ans[] = new String[31];
    static {
        ans[1] = "1";
        ans[2] = "11";
        for(int i = 3; i <= 30; i++) {
            ans[i] = build(ans, i);
        }
    }
    
    public String countAndSay(int n) {
        return ans[n];
    }
    
    private static String build(String[] ans, int cur) {
        char[] ch = ans[cur - 1].toCharArray();
        int count = 1;
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < ch.length - 1; i++) {
            // System.out.println("sb = " + sb.toString());
            if(ch[i] == ch[i + 1]) {
                count++;
            } else {
                sb.append("" + count + ch[i]);
                count = 1;
            }
        }
        sb.append("" + count + ch[ch.length - 1]);
        return sb.toString();
    }
    
//     private String dfs(int n) {
//         if(n == 1)
//             return "1";
        
//         String res = dfs(n - 1);
//         char ch[] = res.toCharArray();
//         // System.out.println("n = " + n + ", len = " + ch.length);
//         if(ch.length == 1)
//             return "1" + ch[0];
        
//         int count = 1;
//         StringBuffer sb = new StringBuffer();
//         for(int i = 0; i < ch.length - 1; i++) {
//             System.out.println("sb = " + sb.toString());
//             if(ch[i] == ch[i + 1]) {
//                 count++;
//             } else {
//                 sb.append("" + count + ch[i]);
//                 count = 1;
//             }
//         }
//         sb.append("" + count + ch[ch.length - 1]);
//         return sb.toString();
//     }
}


标签:11,外观,数字,21,countAndSay,字符串,描述,数列
From: https://blog.51cto.com/u_14813899/6487192

相关文章

  • [SDOI2008] 递归数列
    题面一个由自然数组成的数列按下式定义:对于\(i\lek\):\(a_{i}=b_{i}\)。对于\(i>k\):\(\displaystylea_{i}=\sum_{j=1}^{k}{c_{j}\timesa_{i-j}}\)。其中\(b_{1\dotsk}\)和\(c_{1\dotsk}\)是给定的自然数。写一个程序,给定自然数\(m\len\),计算\(\left(\su......
  • 算法题:求解斐波那契数列
    概念:斐波那契数列是指以0,1开始,之后每一项都等于前两项之和的数列,即:0,1,1,2,3,5,8,13,21,34,55,89,144……以此类推。这个数列最早是由13世纪意大利数学家斐波那契提出的,并在数学、自然科学和计算机科学等领域有着广泛的应用。题目:若有一只兔子,它每个月生一只小兔子,而小兔子......
  • 第11章 外观模式(Façade Pattern)
    外观模式(FaçadePattern)——.NET设计模式系列之十二Terrylee,2006年3月概述在软件开发系统中,客户程序经常会与复杂系统的内部子系统之间产生耦合,而导致客户程序随着子系统的变化而变化。那么如何简化客户程序与子系统之间的交互接口?如何将复杂系统的内部子系统与客户程序之间的依赖......
  • 等差数列
    题目:/***等差数列:*求等差数列前N项的级数之和。不考虑不合理的输入等特殊情况*输入N,首项M,差值K,整型,空格分隔。*/解答:classTest93{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);//codehere......
  • Luogu P1939 【模板】矩阵加速(数列)
    【模板】矩阵加速(数列)题目描述已知一个数列\(a\),它满足:\[a_x=\begin{cases}1&x\in\{1,2,3\}\\a_{x-1}+a_{x-3}&x\geq4\end{cases}\]求\(a\)数列的第\(n\)项对\(10^9+7\)取余的值。输入格式第一行一个整数\(T\),表示询问个数。以下\(T\)行,每行一个正......
  • 计算斐波那契数列的前 N 项
    它使用C++11中的多线程库thread来并行计算斐波那契数列的前N项:#include<iostream>#include<thread>#include<vector>voidfib(std::vector<int>&fib,intstart,intend){for(inti=start+2;i<end;i++){fib[i]=fib[i-1]+......
  • 外观模式:隐藏了复杂系统的复杂性,并提供一个简单的接口来访问系统
    外观模式是一种结构型设计模式,它为复杂子系统提供了一个统一的接口,从而使其更易于使用。外观模式隐藏了子系统的复杂性,并将其封装在一个高级接口中。在使用外观模式时,客户端只需要与外观对象进行交互,而不需要直接与子系统中的各个组件交互。//子系统中的组件classCPU{pu......
  • 外观(门面)模式--Facade
    一、代码示例#include<iostream>usingnamespacestd;classCarmera{public:voidturnOn(){cout<<"相机启动"<<endl;}voidturnOff(){cout<<"相机关闭"<<endl;}};classLig......
  • P5012 水の数列 题解
    水の数列题目大意对于给定的数列\(a\),选择一个数\(x\),定义其得分为数列中所有小于等于\(x\)的数形成的若干个连续区间的平方和除以\(x\)所得到的数。现进行多次询问,每次询问给定两个数\(l,r\),要求出一个得分最大的\(x\),满足数列中所有小于等于\(x\)的数形成的若干个......
  • 外观模式
    TheFacade designpattenprovidesaunifiedinterfacetoasetofinterfacesinasubsystem.Thispatterndefinesahigher-levelinterfacethatmakesthesubsystemeasiertouse.外观模式为子系统一组接口提供了统一的接口,这种模式定义了高级接口,便于子系统调用。......