Javascript:乘法持久性问题建议解决方案执行超时

时间:2019-04-05 13:11:04

标签: javascript function loops if-statement while-loop

我有以下问题:

编写一个持久性函数,该函数接受一个正数num并返回其乘性持久性,这是必须将num中的数字相乘直到达到一位为止的次数。

function persistence(num) {

  let count = 0; 
  let numStr = num.toString(); 

   if (numStr.length === 1){
     return 0
   } 

   if (numStr.length === 2){
     while (numStr.length > 1){
       count += 1
       numStr = (Number(numStr[0])*Number(numStr[1])).toString() 
     }
   }

   if (numStr.length === 3){
     while (numStr.length > 1){
       count += 1
       numStr = (Number(numStr[0])*Number(numStr[1])*Number(numStr[2])).toString() 
     }
   }

   return count 
}

persistence(999) //solution 4

我收到“执行超时(12000毫秒)”错误。我知道有多种方法可以解决此问题,但我想具体了解我的代码有什么问题。

2 个答案:

答案 0 :(得分:2)

由于始终将str[2]添加到最终结果中而导致代码无法正常工作的原因。

999 > 729 > 126 > 12 > 2

因此,在这里您看到一个循环编号变成12,而str[2]undefined,它将是NaN,因此循环永远不会结束。

一种简单的方法是在reduce()中使用while,而在乘法时无需将其转换为Number()

function persistence(num) {

  let count = 0; 
  num = String(num);
  while(num.length > 1){
    count++;
    num = String([...num].reduce((ac,a) => a * ac,1));
  }
  return count;
}

console.log(persistence(999))

答案 1 :(得分:1)

具有递归功能,您可以轻松做到:

只需添加一个新的参数count(调用此函数多少次)并在结果长度大于1的情况下调用它即可

function persistence(num, count) {
  count = count || 0; 
  let numStr = num.toString(); 
  
  if (numStr.length === 1) {
    return count
  } 
  let new_num = numStr.split('').reduce((acc, val) => {
    return acc * val
  }, 1)
  return persistence(new_num, count + 1) 
}

console.log("99", persistence(99))
console.log("999", persistence(999))
console.log("99999", persistence(99999))