需要一些关于我为解决这个 codility 挑战而制定的算法的帮助:
编写一个函数,给定三个整数 A、B 和 K,返回 [A..B] 范围内可被 K 整除的整数个数。
例如,对于 A = 6、B = 11 和 K = 2,您的函数应返回 3,因为在范围 [6..11] 内存在三个可被 2 整除的数字,即 6、8 和 10。
A和B是[0..2,000,000,000]范围内的整数;
K是[1..2,000,000,000]范围内的整数;
A≤B。
public class Solution {
public int solution(int A, int B, int K) {
int counter = 0;
ArrayList<Integer> listOfNumbersInBetween = new ArrayList<>();
for (int i = A; i <= B; i++) {
listOfNumbersInBetween.add(i);
}
for (int arrayElement : listOfNumbersInBetween) {
if (arrayElement % K == 0) {
counter++;
}
}
return counter;
}}
正如您所看到的,我的解决方案工作完美,但由于时间复杂度 O(B-A),其性能得分为 0%。
我怎样才能改进这段代码以使其得分 100%?
使用循环是蛮力,而像这样的挑战不能用蛮力来完成。
这意味着你必须计算结果。像这样的挑战往往是math问题不止一个编程问题,所以请戴上数学帽子。
所以想一想。在一个整数范围内,计算有多少个可以被 K 整除。如果我让你手动执行此操作(允许使用简单的计算器),如果不使用电脑暴力破解,你会怎么做?例如。找出之间有多少个整数111
and 999
可以被整除13
Hint
找到可被 K 整除的范围中的第一个数字,以及可被 K 整除的范围中的最后一个数字。对于上面的示例,这将是117
and 988
.
现在计算从第一个整数到最后一个整数有多少个整数可以被 K 整除,记住对它们都进行计数。那么,之间有多少个整数117
and 988
可以被整除13
?
答案:(988 - 117) / 13 + 1 = 871 / 13 + 1 = 67 + 1 =68
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)