在 java 中移动数组
Moving array in java
所以我有一个连续开始的k个元素的数组,例如
0 1 2
我试图让它上升到某个值,比如 4,最后是
- 0 1 2
- 0 1 3
- 0 1 4
- 0 2 3
- 0 2 4
- 0 3 4
我理解每次数组中的最后一个元素达到最大值时,它必须递增前一个索引并将当前索引设置为前一个索引的值+1,如果前一个索引的值达到最大值减1,我们重复前面索引的步骤,依此类推
但我不确定如何处理它以便它适用于任何 k 元素数组。
非常感谢任何提示或建议!
更新:我尝试制作一种递归移动索引并尝试添加的方法。它有效,但我认为它不是很有效:/
public static int[] nextCombi(int[] arr, int index, int maxVal){
if (index < 0 || maxVal < 0){
return arr;
}
else{
if (arr[index] + 1 == maxVal){
if (index - 1 >= 0){
nextCombi(arr, index - 1, maxVal - 1);
arr[index] = arr[index - 1] + 1;
}
else{
arr[index]++;
return arr;
}
}
else{
// Can add
arr[index]++;
}
}
return arr;
}
主要
while (true){
arr = nextCombi(arr, max, n);
if (arr[0] > max)
break;
}
我认为你应该从列表的末尾开始,升级到没有达到最大值,然后从列表的第一项开始。
这是一个例子:
List<Integer> ints = new ArrayList<>(); // create the list
ints.addAll(Arrays.asList(0, 1, 3)); // add element in it:
int max = 4; // indicate max value
int maxOfLast = Integer.MAX_VALUE; // start with max value to be sure of not reached max
for(int currentIndex = ints.size() - 1; currentIndex >= 0; currentIndex--) {
int current = 0;
while((current = ints.get(currentIndex)) < max && (current + 1) < maxOfLast) { // until it's not the end or reach max of index + 1 value
ints.set(currentIndex, ++current); // upgrade it
System.out.println(ints); // print (see output)
}
maxOfLast = ints.get(currentIndex); // set current value as max for next interation
}
输出:
[0, 1, 4]
[0, 2, 4]
[0, 3, 4]
[1, 3, 4]
[2, 3, 4]
所以我有一个连续开始的k个元素的数组,例如 0 1 2
我试图让它上升到某个值,比如 4,最后是
- 0 1 2
- 0 1 3
- 0 1 4
- 0 2 3
- 0 2 4
- 0 3 4
我理解每次数组中的最后一个元素达到最大值时,它必须递增前一个索引并将当前索引设置为前一个索引的值+1,如果前一个索引的值达到最大值减1,我们重复前面索引的步骤,依此类推
但我不确定如何处理它以便它适用于任何 k 元素数组。
非常感谢任何提示或建议!
更新:我尝试制作一种递归移动索引并尝试添加的方法。它有效,但我认为它不是很有效:/
public static int[] nextCombi(int[] arr, int index, int maxVal){
if (index < 0 || maxVal < 0){
return arr;
}
else{
if (arr[index] + 1 == maxVal){
if (index - 1 >= 0){
nextCombi(arr, index - 1, maxVal - 1);
arr[index] = arr[index - 1] + 1;
}
else{
arr[index]++;
return arr;
}
}
else{
// Can add
arr[index]++;
}
}
return arr;
}
主要
while (true){
arr = nextCombi(arr, max, n);
if (arr[0] > max)
break;
}
我认为你应该从列表的末尾开始,升级到没有达到最大值,然后从列表的第一项开始。
这是一个例子:
List<Integer> ints = new ArrayList<>(); // create the list
ints.addAll(Arrays.asList(0, 1, 3)); // add element in it:
int max = 4; // indicate max value
int maxOfLast = Integer.MAX_VALUE; // start with max value to be sure of not reached max
for(int currentIndex = ints.size() - 1; currentIndex >= 0; currentIndex--) {
int current = 0;
while((current = ints.get(currentIndex)) < max && (current + 1) < maxOfLast) { // until it's not the end or reach max of index + 1 value
ints.set(currentIndex, ++current); // upgrade it
System.out.println(ints); // print (see output)
}
maxOfLast = ints.get(currentIndex); // set current value as max for next interation
}
输出:
[0, 1, 4]
[0, 2, 4]
[0, 3, 4]
[1, 3, 4]
[2, 3, 4]