打印特定字符串序列

时间:2016-10-17 15:10:38

标签: java algorithm

这是我的第一个问题。

我需要做一个返回特定字符串序列的函数,例如:

第一次通话返回“a” 第二个电话返回“b”, 第3次通话返回“c” 第4个回复“a” 第5次通话返回“a” 第6次通话返回“b” 第7次通话返回“b” 第8次通话返回“c” 第9次调用返回“c”等(序列是a,b,c - a,a,b,b,c,c - a,a,a,b,b,b,c,c,c等)

该函数必须只返回特定的字符串,所以如果我通过执行“println(magicFunction())”调用该函数2次;两次,它必须在第一次调用时返回“a”,在第二次调用时返回“b”。

以下是我在Java中尝试做的事情。

public class Main {

static int repetitions = 1;
static int said = 0;
static int cursor = 0;
static String[] list= {"a", "b", "c"};

public static void main(String[] args) {
    for (int i = 0; i < 15; i++) 
        System.out.println(nextStr());
}

public static String nextStr() {

    if (said >= repetitions ) {
        cursor++;
        said = 0;
    } else {
        said ++;
    }

    if (cursor == 2 && said == repetitions ) {
        cursor = 0;
    }

    return list[cursor];
 }
}

2 个答案:

答案 0 :(得分:1)

我认为这将实现您的目标。

cursor0开始,如果queried == queryLetter则增加1。

queried == queryLetter时,queried重置为0

如果cursor == characters.length然后按queryLetter增加1

public class CharSource {

    private int cursor = 0;
    private int queryLetter = 1;
    private int queried = 0;
    private char[] characters = new char[]{'a', 'b', 'c'};

    public static void main(String[] args) {
        CharSource source = new CharSource();
        for (int i=0; i<40; i++) {
            System.out.println(source.get());
        }
    }

    public char get() {
        char result = characters[cursor];
        if (++queried == queryLetter) {
            if (++cursor == characters.length) {
                cursor = 0;
                queryLetter++;
            }
            queried = 0;
        }
        return result;
    }

}

答案 1 :(得分:0)

这是一个非常长的流来生成序列:

Stream<Character> stream = IntStream.range(0, Integer.MAX_VALUE)
    .mapToObj(i -> i)
    .flatMap(i -> IntStream.rangeClosed(0, i/3).mapToObj(j -> (char)('a' + i % 3)));

打印前100个元素:

stream.limit(100).forEach(System.out::println);

生成

Math.floor((n + 1) * (n + 2) / 6)
最大元素数量,如果这还不够,您可以随时切换到LongStream