Java - 算法 - 显示序列的所有可能性
Java - Algorithm - Display all the possibilities of sequence
请帮我找到最有效的解决方案。
int max = 2;
int sequenceLength = 3;
List<Integer> sequence = new ArrayList<Integer>(sequenceLength);
List<List<Integer>> possibilitites = new ArrayList<List<Integer>>();
...solution...
System.out.print(possibilitites);
sequenceLength 是每个序列的长度。
序列将包含数字的组合,介于 0 到 Max 之间,即 2。
每个创建的序列,都将添加到可能性中。
解决方案应该能够处理任何最大和 sequenceLength。
预期结果:
(0,0,0),(0,0,1),(0,0,2),(0,1,0),(0,1,1),等等
@user3386109 在评论中建议的序列生成器的基于循环的简单实现:
static List<List<Integer>> generate(final int max, final int len) {
final int limit = max + 1;
List<List<Integer>> result = new ArrayList<>();
for (int i = 0, n = (int) Math.pow(limit, len); i < n; i++) {
List<Integer> list = new ArrayList<>();
int num = i;
for (int j = 0; j < len; j++) {
list.add(0, num % limit);
num /= limit;
}
result.add(list);
}
return result;
}
其他选项是使用 String.format
并转换为具有特定基数 (max + 1
) 的整数:
static List<List<Integer>> generate2(final int max, final int len) {
final int limit = max + 1;
return IntStream
.range(0, (int)Math.pow(limit, len))
.mapToObj(i ->
String.format("%" + len + "s", Integer.toString(i, limit))
.replace(' ', '0')
.chars()
.map(c -> c - '0')
.boxed()
.collect(Collectors.toList())
)
.collect(Collectors.toList());
}
请帮我找到最有效的解决方案。
int max = 2;
int sequenceLength = 3;
List<Integer> sequence = new ArrayList<Integer>(sequenceLength);
List<List<Integer>> possibilitites = new ArrayList<List<Integer>>();
...solution...
System.out.print(possibilitites);
sequenceLength 是每个序列的长度。
序列将包含数字的组合,介于 0 到 Max 之间,即 2。
每个创建的序列,都将添加到可能性中。
解决方案应该能够处理任何最大和 sequenceLength。
预期结果:
(0,0,0),(0,0,1),(0,0,2),(0,1,0),(0,1,1),等等
@user3386109 在评论中建议的序列生成器的基于循环的简单实现:
static List<List<Integer>> generate(final int max, final int len) {
final int limit = max + 1;
List<List<Integer>> result = new ArrayList<>();
for (int i = 0, n = (int) Math.pow(limit, len); i < n; i++) {
List<Integer> list = new ArrayList<>();
int num = i;
for (int j = 0; j < len; j++) {
list.add(0, num % limit);
num /= limit;
}
result.add(list);
}
return result;
}
其他选项是使用 String.format
并转换为具有特定基数 (max + 1
) 的整数:
static List<List<Integer>> generate2(final int max, final int len) {
final int limit = max + 1;
return IntStream
.range(0, (int)Math.pow(limit, len))
.mapToObj(i ->
String.format("%" + len + "s", Integer.toString(i, limit))
.replace(' ', '0')
.chars()
.map(c -> c - '0')
.boxed()
.collect(Collectors.toList())
)
.collect(Collectors.toList());
}