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;
        }
    
  • 相关阅读:
    Qt发送事件与自定义事件
    Qt文本流和数据流
    Qt文件操作
    Qt 布局管理器
    Qt 标准对话框
    Qt 对话框QDailog及其类型
    Qt 对象间的父子关系
    Qt 信号与槽
    Qt 计算器界面实现
    C++ 多态、虚函数(virtual 关键字)、静态联编、动态联编
  • 原文地址:https://www.cnblogs.com/hyserendipity/p/8856725.html
Copyright © 2011-2022 走看看