除当前索引值外的新数组中数组的乘积
Product of array in a new array except the current index value
给定一个整数数组,创建一个新数组,使得新数组索引 i
处的每个元素都是原始数组中除了 i
处的元素之外所有数字的乘积.
例如,如果我们的输入是 [1, 2, 3, 4, 5]
,则预期输出将是 [120, 60, 40, 30, 24]
。如果我们的输入是 [3, 2, 1]
,预期输出将是 [2, 3, 6]
.
注意:不要使用除法。
import java.util.Scanner;
public class Productofarray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int prod = 1, i, j = 0;
System.out.println("How many values do you want to enter");
int n = sc.nextInt();
int a[] = new int[n];
int a2[] = new int[n];
System.out.println("Input " + n + " values:");
for (i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (i = 0; i < n; i++) {
inner:
while (j < n) {
if (a[j] == a[i]) {
j++;
continue inner;
}
prod *= a[j];
}
a2[i] = prod;
System.out.println(a2[i]);
}
}
}
我写了这段代码,但问题是它一直在 运行 并且它永远不会结束,有人可以帮助我解决我在这里做错的问题吗?
因为当 i!=j 时您没有递增 j。另外,你应该检查 i==j 而不是 a[i]==a[j].
这会让你们更亲近;正如 Maneesh 的回答所指出的,您没有检查您是否处于当前索引,即 i == j
而不是 a[i]==a[j]
。您也不需要标签,建议您完全避免使用它们。
for(int i=0; i<n; i++)
{
// this loop can be replaced with a stream.reduce - however that seems to require copying a1 in place to remove the element at index i first as reduce doesn't seem to pass the current index.
for(int j = 0; j < n; j++) {
if(j i) continue;
a2[i] *= a1[j];
}
System.out.println(a2[i]);
}
我花了一秒钟才弄明白,但这是一个使用 Java 8 Stream API 的示例:
for(int i=0; i<n; i++) // for i -> n
{
final int currentIndex = i;
a2[i] = IntStream.range(0, a1.length)
.filter(index -> index != currentIndex) // ingore the curent index
.map(index -> a1[index]) // map the remaining indecies to the values
.reduce((subTotal, current) -> subTotal * current); // reduce to a single int through multiplication.
}
System.out.println(a2[i]);
我还没有测试过它,但它应该可以工作(可能需要一两次调整)。这。它的要点是创建一个新数组 (IntStream.range
),其中包含给定数组的每个元素,但 currentIndex (.filter().map()
) 处的元素除外,然后将元素相乘 (reduce(... subTotal * current)
)。请注意,此解决方案通过 for 循环为每次迭代创建一个新数组,对于非常大的数组,内存效率低下。
给定一个整数数组,创建一个新数组,使得新数组索引 i
处的每个元素都是原始数组中除了 i
处的元素之外所有数字的乘积.
例如,如果我们的输入是 [1, 2, 3, 4, 5]
,则预期输出将是 [120, 60, 40, 30, 24]
。如果我们的输入是 [3, 2, 1]
,预期输出将是 [2, 3, 6]
.
注意:不要使用除法。
import java.util.Scanner;
public class Productofarray {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int prod = 1, i, j = 0;
System.out.println("How many values do you want to enter");
int n = sc.nextInt();
int a[] = new int[n];
int a2[] = new int[n];
System.out.println("Input " + n + " values:");
for (i = 0; i < n; i++) {
a[i] = sc.nextInt();
}
for (i = 0; i < n; i++) {
inner:
while (j < n) {
if (a[j] == a[i]) {
j++;
continue inner;
}
prod *= a[j];
}
a2[i] = prod;
System.out.println(a2[i]);
}
}
}
我写了这段代码,但问题是它一直在 运行 并且它永远不会结束,有人可以帮助我解决我在这里做错的问题吗?
因为当 i!=j 时您没有递增 j。另外,你应该检查 i==j 而不是 a[i]==a[j].
这会让你们更亲近;正如 Maneesh 的回答所指出的,您没有检查您是否处于当前索引,即 i == j
而不是 a[i]==a[j]
。您也不需要标签,建议您完全避免使用它们。
for(int i=0; i<n; i++)
{
// this loop can be replaced with a stream.reduce - however that seems to require copying a1 in place to remove the element at index i first as reduce doesn't seem to pass the current index.
for(int j = 0; j < n; j++) {
if(j i) continue;
a2[i] *= a1[j];
}
System.out.println(a2[i]);
}
我花了一秒钟才弄明白,但这是一个使用 Java 8 Stream API 的示例:
for(int i=0; i<n; i++) // for i -> n
{
final int currentIndex = i;
a2[i] = IntStream.range(0, a1.length)
.filter(index -> index != currentIndex) // ingore the curent index
.map(index -> a1[index]) // map the remaining indecies to the values
.reduce((subTotal, current) -> subTotal * current); // reduce to a single int through multiplication.
}
System.out.println(a2[i]);
我还没有测试过它,但它应该可以工作(可能需要一两次调整)。这。它的要点是创建一个新数组 (IntStream.range
),其中包含给定数组的每个元素,但 currentIndex (.filter().map()
) 处的元素除外,然后将元素相乘 (reduce(... subTotal * current)
)。请注意,此解决方案通过 for 循环为每次迭代创建一个新数组,对于非常大的数组,内存效率低下。