示例: expand(new int[]{3, 2, 5}) -> {0, 0, 0, 1, 1, 2, 2, 2, 2, 2}
我正在尝试让它创建一个新数组来打印 3, 3 次的索引。所以 3 将是 0,0,0。
public static int[] expand(int[] input) {
int c = 0;
int[] myArray = new int[sum(input)];
if(input.length == 0){
return new int[0];
}
for(int i = 0; i < input.length; i++) {
int a = input[i];
for(int j = c; j < a; j++) {
c += j;
myArray[j] = i;
}
}
return myArray;
}
目前这只能部分工作,我似乎无法弄清楚如何正确浏览整个数组。此外,索引零似乎被跳过了。
你很接近! 似乎您只需要稍微修改嵌套的 for 循环:
for (int j = 0; j < a; j++) {
myArray[c++] = i;
}
当您使用c
跟踪当前索引时,这只是将索引c
处的元素设置为i
并递增c
。 您还可以删除a
并使用input[i]
代替它。
注意:从0
开始j
比从c
更容易。
函数方法
public class Main {
public static void main(final String... args) {
int[] items = expand(new int[]{3, 2, 5});
System.out.println(Arrays.toString(items));
}
public static int[] expand(int[] input) {
return IntStream.range(0, input.length)
.flatMap(p -> IntStream.generate(() -> p).limit(input[p]))
.toArray();
}
}
这将产生索引流,并且对于每个项目,获取许多索引,将它们全部放入数组中