zoukankan      html  css  js  c++  java
  • 外观数列

    外观数列

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

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

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

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

    1. 1
      
    2. 11
      
    3. 21
      
    4. 1211
      
    5. 111221
      

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

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

    示例 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();
    //     }
    }
    
  • 相关阅读:
    设置元素等待.py
    javaWeb服务详解(含源代码,测试通过,注释)
    com.sun.istack.SAXException2: 在对象图中检测到循环。这将产生无限深的 XML
    com.sun.istack.SAXException2: 在对象图中检测到循环。这将产生无限深的 XML
    No services have been found解决方案
    No services have been found解决方案
    JavaMail给QQ邮箱发邮件报错,没有SSL加密
    JavaMail给QQ邮箱发邮件报错,没有SSL加密
    JavaMail给QQ邮箱发邮件报错
    JavaMail给QQ邮箱发邮件报错
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/13931657.html
Copyright © 2011-2022 走看看