我必须找到所有正数的因子,这些因子平均分为一个数字,然后返回列表的p^th元素,按升序排序。 如果没有p^th return 0.

我测试了几乎所有我能解决的答案,并在网上找到:

例子:

function pthFactor(n, k) {
let arr = [];
for (let i = 1; i <= n; i++) {
    if (n % i === 0) {
        arr.push(i);
    }
    if (arr.length === k) {
        return arr[arr.length - 1];
    }
}
if (arr.length !== k) {
    return 1;
}
};

要么

var kthFactor = function(n, k) {
let factors = [1]
for(let i=2;i<=Math.floor(n/2);i++){
    if(n%i == 0) factors.push(i)
}
factors.push(n)

return factors.length < k?-1:factors[k-1]
};

但它失败的 10 秒时间限制。

我做错了什么?

顺便说一下,我也尝试过Math.sqrt等,以免循环n次。 也没有奏效。 我需要知道的不仅仅是 for 循环吗? 像动态规划等来解决这个问题?

===============>>#1 票数:0

我在 HackerRank 上找不到这个挑战,但是 1492.LeetCode上 n挑战的第 k 个因子似乎与您描述的相同:

给定两个正整数nk

整数n因数定义为整数i ,其中n % i == 0

考虑按升序排序的n的所有因子的列表,返回此列表中kth因子,如果n因子少于k n则返回-1

奇怪的是,您在第一个代码块中使用了名称pthFactor ,而相关参数的名称是k而不是p 这很令人困惑。

我也尝试过Math.sqrt等,以免循环n

你不能只考虑 𝑛 平方根以内的因子。 例如,6 是 12 的因数,甚至 12 也是 12 的因数。

然而,大约一半的因子都在平方根的范围内。 那些较大的因数等于用这些较小的因数进行除法得到的商。 所以最后,你可以在平方根处停下来,前提是你收集了所有这些商,如果你还没有达到第 𝑘 th因子,就从那些商中选择正确的。

所以这个想法是如何实现的:

 var kthFactor = function(n, k) { let bigFactors = []; let quotient = n + 1; for (let factor = 1; factor < quotient; factor++) { if (n % factor === 0) { quotient = n / factor; k--; if (k <= 0) return factor; if (factor >= quotient) break; bigFactors.push(quotient); } } return bigFactors[bigFactors.length - k] ?? -1; }; // A few test cases: console.log(kthFactor(12, 3)); // 3 console.log(kthFactor(7, 2)); // 7 console.log(kthFactor(16, 5)); // 16 console.log(kthFactor(27, 5)); // -1 console.log(kthFactor(927, 1)); // 1

===============>>#2 票数:0

此代码使用与trincot's answer相同的算法,但我认为它用递归表示更简单:

 const kthFactor = (n, k, f = 1, r = []) => f * f > n ? r [k - 1] ?? -1 : n % f == 0 ? k == 1 ? f : kthFactor (n, k - 1, f + 1, f * f == n ? r : [n / f, ...r]) : kthFactor (n, k, f + 1, r) console .log (kthFactor (12, 3)); //=> 3 console .log (kthFactor (7, 2)); //=> 7 console .log (kthFactor (16, 5)); //=> 16 console .log (kthFactor (27, 5)); //=> -1 console .log (kthFactor (927, 1)); //=> 1

在这里,我们跟踪我们正在测试的因子 ( f ) 和要测试的剩余数字 ( r ),每当我们找到一个新因子时就减少k并将商n / f添加到我们剩余的数字上,在每一步增加f ,停止当我们变得太大时( f * f > n )然后在剩余数字的有序列表中找到索引,当k1时返回因子,否则简单地重复递增因子。

唯一棘手的一点是完美平方的处理,其中平方根应该只计算一次,因此如果f * f == n ,我们不会将其添加到剩余数字中。

因为是递归的,所以这只适合k这么大的情况。 虽然我们可以用一种简单的方式使这个尾递归,但在撰写本文时这并不重要,因为尾调用优化在大多数引擎中没有发生。

===============>>#3 票数:-1

你快到了! 这里有一些建议

从 2 开始循环

不需要测试除以 1。

允许多次找到一个因素

在您现有的代码中,您只测试每个可能的因素一次。 但一个因素可能不止一次出现。 例如,18 是 2 * 3 * 3。因此,将if替换为while并将乘积n除以因子,每次找到一个。

严格来说,您不需要制作“arr”数组。

我没有删除它,因为它对 console.log 发现的因素在诊断上很有用。 但是,您可以删除它的初始化和更新,该程序仍然可以工作:只需保持对找到的因子的数量进行计数即可。

您不必阅读“arr”即可找到第“k”个因子。

它是“i”的值,在您找到该因素时。

如果没有第 k 个因子,您应该返回 0,而不是 1

我已经更新了代码来做到这一点。

你是对的,停在 sqrt(n) 是有帮助的

由于我们正在减少 n,我们只需要直到这个新的(较低的)n 的平方根。 这很有帮助,因为它大大减少了搜索时间。

与测试sqrt(a)小于b ,测试a小于b*b通常会稍微快一点,因为一切都是整数。 我已经为你实现了。

 function pthFactor(n, k) { let arr = []; for (let i = 2; i <= n; i++) { while (n % i === 0) { arr.push(i); n = n / i if (arr.length ===k){console.log("factors so far: ", arr, " and remaining product is ", n); return i} if (i*i>n) return 0 } } }; console.log(pthFactor(3*5*7*11*13*17,4))

  ask by Uriah RV translate from so

未解决问题?本站智能推荐:

2回复

电子商店hackerRank挑战在Javascript中

Hi I did not pass the all the tests, only 9/16.嗨,我没有通过所有测试,只有 9/16。 so I want to know what is the problem in my code problem link: https://www.hackerr
3回复

HackerRank对角差的时间复杂度

Can anyone help me identify the time complexity of the following code?谁能帮我确定以下代码的时间复杂度? Background: this is a HackerRank algorithm problem where the e
2回复

Hackerrank算法挑战问题-在hackerrank环境(节点)中显示类型错误,但在浏览器控制台上工作正常。怎么了?

function birthdayCakeCandles(n, ar) {let max = 0;for(let i = 0; i < ar.length; i++) { if(ar[i] > max) { max = ar[i]; }}let count =
3回复

Javascript有办法做“find_if”或“FirstOrDefault”吗?

I'm a Junior-level JavaScript developer and I find that I often have situations where I need to do the equivalent of 我是一名初级JavaScript开发人员,我发现我经常遇到需要做
1回复

karatsuba大量乘法在javascript中失败

I've tried two versions of a karatsuba multiplcation algorithm and they both fail with different results when I test them with large X and Y values.
2回复

计算阶乘超过JavaScript中的最大整数限制

I am trying to create a function for calculating factorial of a given number. 我正在尝试创建一个函数来计算给定数字的阶乘。 It works fine until I pass a number greater than