CountDiv (Codility) 挑战算法的性能问题

2024-01-10

需要一些关于我为解决这个 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(使用前将#替换为@)

CountDiv (Codility) 挑战算法的性能问题 的相关文章

随机推荐