Kolakoski数列

Posted hyserendipity

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
    }

 

以上是关于Kolakoski数列的主要内容,如果未能解决你的问题,请参考以下文章

搜狐_笔试_题目一kolakoski序列

PTA乙级 (1049 数列的片段和 (20分))

1049. 数列的片段和(20)

1049 数列的片段和 (20 分)

PAT 1049. 数列的片段和

B1049 数列的片段和