r的所有组合以遍历数据结构

r8uurelv  于 2021-07-05  发布在  Java
关注(0)|答案(2)|浏览(426)

我想创建所有可能的变体来遍历数据结构。当我横移时,我可以向左(l)或向右(r)。所以我的计划是在遍历数据结构之前,生成所有可能的路径。每个字符都应该作为遍历的指令。
我需要一个方法来生成以下内容:

private List<String> createPaths(int len){
            List<String> result = new ArrayList<>();
            // no clue how to generate them
            return result;
     }

对于len=1,结果应该是:{l,r}
对于len=2,结果应该是:{ll,lr,rr,rl}
对于len=3,结果应该是:{lll,llr,lrl,lrr,rll,rlr,rrl,rrr}
我已经试着用二进制数来解决这个问题,但我失败了。

wlwcrazw

wlwcrazw1#

“二进制数”是一个非常好的方法。所以首先把你的路径想象成二进制数。
所以对于 len=3 所有长度为3的二进制数。
这些是数字0到7(十进制)。(=2^3=8个数字)
所以写一个循环从中计数 0 to (2^len -1) 而不是简单地将数字转换成二进制表示,用r替换0,用l替换1(所有前导的0都得到长度的二进制表示) len )

vsnjm48y

vsnjm48y2#

你使用二进制数的建议在我看来是可行的。我们可以生成一个在0和2的某个幂之间的固定宽度和零填充二进制数的集合。然后,将所有零替换为 L 所有的人 R .

private List<String> createPaths(int len) {
    List<String> result = new ArrayList<>();
    String formatWidth = "%" + len + "s";

    for (int i=0; i < Math.pow(2, len); ++i) {
         String val = String.format(formatWidth, Integer.toBinaryString(i))
             .replace(' ', '0')
             .replace("0", "L")
             .replace("1", "R");
         result.add(val);
    }

    return result;
}

System.out.println(createPaths(3));

这张照片:

[LLL, LLR, LRL, LRR, RLL, RLR, RRL, RRR]

相关问题