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



我有以下问题:

编写一个函数 persistence,它接受一个正参数 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 毫秒("错误。 我知道有不同的方法可以解决这个问题,但我想知道我的代码出了什么问题。

代码不起作用的原因,因为您总是在最终结果中添加str[2]

999 > 729 > 126 > 12 > 2

所以在这里你看到一个循环编号变得12并且str[2] undefined并且它将NaN,因此循环永远不会结束。

一个简单的方法是在while中使用reduce(),无需在乘法时将 转换为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))

使用递归函数,您可以轻松完成:

只需添加一个新的 args 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))

相关内容

最新更新