这是一个非常简单的问题,但我遇到了麻烦。我想创建一个显示给定数字n
的前x
个除数的方法。我选择创建一个存储x
的所有倍数的数组,然后输入要查看的数量。
例如,如果x = 20
,那么我将拥有[1, 2, 4, 5, 10, 20]
,而前4个将是1
,2
,4
和{{1} }。
这是我写的:
5
我认为有更好的方法可以做到这一点,但我想在解决方案中提供一些技巧。
答案 0 :(得分:1)
错误是您将整个搜索循环所需的次数-每个结果一次。这非常贵。请注意,内部循环是代码,只需要循环一次即可。存储每个匹配的数字后,您可以增加数组的索引来保存值。
您在这里:
public static String multOf(int x, int n) {
int[] result = new int[n]; // To store the result
int count = 0; // A counter to not exceed the 'n'
for (int i=1; i<Math.round(x/2); i++) { // The iteration starting from the zero
if (x % i == 0) { // Is 'x' divisible by 'i'?
result[count] = i; // ... if so, save to the array
count++; // ... and increment the index
} if (count == n) { // If the limit has been reached
break; // ... leave the iteration
}
}
return Arrays.toString(result); // Return the result
}
但是,在诸如multOf(20,9)
之类的调用中,如果除数的数量小于要求的数量,则输出看起来像[1, 2, 4, 5, 0, 0, 0, 0, 0]
。
因此,我建议使用List<Integer>
:
public static String multOf(int x, int n) {
List<Integer> list = new ArrayList<>();
int count = 0;
for (int i=1; i<Math.floor(x/2); i++) {
if (x % i == 0) {
list.add(i);
} if (list.size() == n) {
break;
}
}
return list.toString();
}
现在,multOf(20,9)
调用将产生[1, 2, 4, 5]
。
一个真正痴迷于Java 8 Stream API的爱好者会做(但是,要慢一些):
public static String multOf(int x, int n) {
return IntStream.rangeClosed(1, x/2)
.boxed()
.filter(i -> x % i == 0)
.limit(n)
.collect(Collectors.toList())
.toString();
}