JS算法-阶乘后的零

简介: JS算法-阶乘后的零

题目


给定一个整数 n ,返回 n! 结果中尾随零的数量。

输入: n = 3
输出: 0
解释: 3! = 6 ,不含尾随 0


题解


第一种


我们用一个数组dp来记录每个数字的阶乘末尾零的个数。dp[i]表示i的阶乘末尾零的个数。我们从1开始遍历到n,对于每个i,我们计算出i5的个数,然后用dp[i-1]加上这个数,就得到了dp[i]。最后返回dp[n]即可,在这里我们需要注意的是,计算5的个数时,我们需要用while循环不断除以5,直到除不尽为止。这样可以避免重复计算

var trailingZeroes = function (n) {
  let dp = new Array(n).fill(0);
  dp[0] = 0;
  const fiveCounts = n => {
    let cnt = 0;
    while (n % 5 === 0) {
      cnt++;
      n = n / 5;
    }
    return cnt;
  }
  for (let i = 1; i <= n; i++) {
    let fives = fiveCounts(i);
    dp[i] = dp[i - 1] + fives;
  }
  return dp[n];
};


第二种


函数trailingZeroes接收一个整数n,如果n为0则直接返回0。否则,定义一个名为handler的递归函数,用来计算n的阶乘,返回值为BigInt类型。在函数中,当n等于1时返回1,否则返回n乘以handler(n-1n)的结果。这里使用BigInt类型是因为计算阶乘时很容易超出JS的计数范围,而使用BigInt可以避免这个问题,然后我们接下来,调用handler(BigInt(n))计算出n的阶乘,并将结果转化为字符串,赋值给变量result。接着,获取result的长度,用变量len记录下来。定义变量count初始化为0,用来记录末尾零的个数。从字符串的末尾开始遍历,如果当前字符是零,就将count加1;否则,跳出循环。最后,返回count即可

var trailingZeroes = function (n) {
  if (!n) return 0;
  const handler = (n) => {
    if (n === 1n) return 1n;
    return n * handler(n - 1n);
  }
  const result = handler(BigInt(n)).toString();
  const len = result.length;
  let count = 0;
  for (let i = len - 1; i >= 0; i--) {
    if (result[i] === '0') {
      count += 1;
    } else {
      break;
    }
  }
  return count;
};
相关文章
|
3月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之String常用操作方法
这篇文章详细介绍了JavaScript中字符串的基本操作,包括创建字符串、访问特定字符、字符串的拼接、位置查找、大小写转换、模式匹配、以及字符串的迭代和格式化等方法。
JS算法必备之String常用操作方法
|
4月前
|
JavaScript 算法 前端开发
JS算法必备之Array常用操作方法
这篇文章详细介绍了JavaScript中数组的创建、检测、转换、排序、操作方法以及迭代方法等,提供了数组操作的全面指南。
JS算法必备之Array常用操作方法
|
2月前
|
算法 定位技术
数据结构与算法学习九:学习递归。递归的经典实例:打印问题、阶乘问题、递归-迷宫问题、八皇后问题
本文详细介绍了递归的概念、重要规则、形式,并展示了递归在解决打印问题、阶乘问题、迷宫问题和八皇后问题等经典实例中的应用。
48 0
|
4月前
|
算法 JavaScript 前端开发
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
国标非对称加密:RSA算法、非对称特征、js还原、jsencrypt和rsa模块解析
308 1
|
4月前
|
JavaScript 算法 前端开发
"揭秘Vue.js的高效渲染秘诀:深度解析Diff算法如何让前端开发快人一步"
【8月更文挑战第20天】Vue.js是一款备受欢迎的前端框架,以其声明式的响应式数据绑定和组件化开发著称。在Vue中,Diff算法是核心之一,它高效计算虚拟DOM更新时所需的最小实际DOM变更,确保界面快速准确更新。算法通过比较新旧虚拟DOM树的同层级节点,递归检查子节点,并利用`key`属性优化列表更新。虽然存在局限性,如难以处理跨层级节点移动,但Diff算法仍是Vue高效更新机制的关键,帮助开发者构建高性能Web应用。
76 1
|
4月前
|
算法 JavaScript 前端开发
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
对称加密算法解析:DES、AES及其在`pycryptodome` 和 `crypto-js` 模块中的应用
189 1
|
4月前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
578 1
|
5月前
|
算法 JavaScript
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
70 0
JS 【详解】树的遍历(含深度优先遍历和广度优先遍历的算法实现)
|
7天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。