zoukankan      html  css  js  c++  java
  • Kolakoski数列

    2018-04-16 15:40:16

    Kolakoski序列是一个仅由1和2组成的无限数列,是一种通过“自描述”来定义的数列。他在整数数列大全网站上排名第二位,足见该数列在组合数学界中的重要性。

    Kolakoski序列的前几项为:1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,… (sequence A000002 in the OEIS)。

    如果我们将相同的数字组成一组那么可以得到:

    1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1,2,1,1,2,1,2,2,1,2,2,1,1,2,1,2,2,...
    1, 2 , 2 ,1,1, 2 ,1, 2 , 2 ,1, 2 , 2 ,1,1, 2 ,1,1, 2 , 2 ,1, 2 ,1,1, 2 ,1, 2 , 2 ,1,1, 2 ,...

    也就是说Kolakoski序列是一个分形数列:即将数列中相邻的数字以其个数合并,得到的仍将是数列本身。

    分析:在Kolakoski数列中1,2是交替出现的,那重要的就是得到当前数出现的次数,当达到出现次数后,将之转成另一个数即可,至于如何获得出现次数,由于Kolakoski是自生成的,所以用一个指针指向当前生成的个数即可。

    问题描述:

    问题求解:

        public int magicalString(int n) {
            if (n == 0) return 0;
            if (n <= 3) return 1;
            int[] a = new int[n + 1];
            a[0] = 1;
            a[1] = 2;
            a[2] = 2;
            int head = 2;
            int tail = 3;
            int num = 1;
            int res = 1;
            while (tail < n) {
                for (int i = 0; i < a[head]; i++) {
                    a[tail] = num;
                    if (num == 1 && tail < n) res++;
                    tail++;
                }
                num = num ^ 3;
                head++;
            }
            return res;
        }
    
  • 相关阅读:
    表达式:使用API创建表达式树(3)
    表达式:使用API创建表达式树(2)
    表达式:使用API创建表达式树(1)
    设计模式——策略模式
    设计模式——简单工厂
    Vue计算属性的用法
    Vue之组件使用(二)
    Vue之组件使用(一)
    Spring官网下载dist.zip的几种方法
    尝试加载 Oracle 客户端库时引发 BadImageFormatException
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/8856725.html
Copyright © 2011-2022 走看看