3 次测试中递归数字和 hackerrank javascript 运行时错误

问题描述 投票:0回答:3

我正在尝试解决

Recurive Digit Sum
,实际上我解决了它,但是提交时我在
3 runtime errors
上得到了
large inputs
。 我已经优化了我的代码很多,但我仍然得到
runtime errors
。我已经googled并尝试了我在互联网上获得的所有答案/解决方案,但它们都是错误的,这些代码无法通过所有测试用例。我认为我的代码应该进一步优化,但我不知道如何优化。
这是我的代码:

function superDigit(n, k) {
    // Write your code here
    if (n < 10) return n
    
    let c = ""
    let i = 0
    if (k && k > 0) {
        while(i < k) {
            c += n
            i++
        }
    }
    
    return findSum(c === "" ? n : c)
}

function findSum(n) {    
    let sum = 0
    let i = 0
    while(i < n.length) {
        sum += +n[i]
        i++
    }
    
    if (sum < 10) return sum
    
    return findSum(sum.toString())
}

我被困住了,任何帮助将不胜感激!

javascript algorithm recursion math data-structures
3个回答
1
投票

我只是进一步优化了我的代码,所有测试用例都通过了。
注意:我没有使用像

reduce
这样的任何内置方法,否则这段代码应该更短,带有
reduce

function superDigit(n, k) {
    // Write your code here
    
    if (n.length === 1) return n
    
    const nArr = n.split('')
    let sum = 0
    let i = 0
    while(i < nArr.length) {
        sum += +nArr[i]
        i++
    }
    sum = (sum * k) + ''
    
    return superDigit(sum, 1)
}

0
投票

我认为你的方法有效。您还可以在下面找到我的看法:

digsum()

function digsum(n){
  return n<10? n :
   digsum((""+n).split("").reduce((a,c)=>+a+(+c)))
}

function superDigit(n, k) {
// Write your code here
if (n < 10) return n

let c = ""
let i = 0
if (k && k > 0) {
    while(i < k) {
        c += n
        i++
    }
}

return findSum(c === "" ? n : c)
}

function findSum(n) {    
let sum = 0
let i = 0
while(i < n.length) {
    sum += +n[i]
    i++
}

if (sum < 10) return sum

return findSum(sum.toString())
}

[123456,6600,888885439].forEach(n=>
 console.log(superDigit(n,1),digsum(n)));


0
投票

这是我不使用reduce的解决方案:

function arraySum(arr){
    let result=0;
    for(let i=0;i< arr.length;i++){
        result =result+ Number(arr[i]);
    }
    return result;
}
function superDigit(n, k) {
    // Write your code here
    let sum =arraySum(n)*k;
    // Handle edge cases
    if (n.length === 0) return 0;
    if (n.length === 1 && k === 1) return Number(n);
    return recrusiveSDigit(sum);
}
function recrusiveSDigit(sum){
    if(sum<10){
        return sum;
    }
    return recrusiveSDigit(arraySum(String(sum)));
    
}

© www.soinside.com 2019 - 2024. All rights reserved.