LeetCode172. Factorial Trailing Zeroes

博客围绕LeetCode题目展开,题目是求给定整数n的阶乘末尾0的个数。题解给出两种方法,暴力法会超时,不符合对数时间复杂度要求;找规律法将问题转化为求乘数中质因数5的个数,通过对5的各次方倍数计算,时间复杂度为对数级别,满足题目要求。

题目

Given an integer n, return the number of trailing zeroes in n!.

Example 1:

Input: 3 Output: 0 Explanation: 3! = 6, no trailing zero. Example 2:

Input: 5 Output: 1 Explanation: 5! = 120, one trailing zero. Note:
Your solution should be in logarithmic time complexity.

想记录一下这道题的原因还是今天恰好碰到了一道笔试题,问到的是一串数字的积,它的末尾有多少个0,看到这题就想到了LeetCode的这题,顺便记录一下。

题意很简单,就是给一个数n,让你找出n的阶乘末尾有几个0,比如n=3,3的阶乘是6,没有0,再比如n=5,阶乘是120,有一个0.

题解

解法一:暴力(会超时)

最简单的想法就是把阶乘求出来,然后再依次看它末尾有几个0,但是n如果很大,这个数能不能表示出来都是问题,然后再求末尾0肯定超时。而且题目要求是在对数时间范围内求解。

解法二:找规律

想一下要使得末尾出现0,那么意味着是10的倍数,也就意味着需要知道这些数的乘积中有多少个可以拎出来的10,而10又是可以拆成2乘5,所以我们可以把问题转换成这些乘数中能质因数分解成多少个2和5的乘积对
进一步,我们知道只要是大于等于2的数,它的阶乘中拆成的2的数量肯定是比5多的,因为每一个偶数就可以拆一个2出来,但是5需要5的倍数来拆,所以这个问题又进一步化成求乘数中有多少个5

那么最简单的做法,就是对每一个数,看是不是5的倍数,是就加一,最后加出来的结果就是0的个数。但是注意还有一些特殊的数字,比如25,125这种5的乘方,它们提供的5的数量不止普通的5的个数,所以需要单独考虑,比如5的非乘方倍数就提供一个5,而5的平方25的倍数就提供2个5,比如25,50,75…,再比如5的立方就提供3个5,比如125,625…
这样一看,我们的思路就清晰了,只需要在不超过n的范围内,对5的1次,2次,…n次的平方的倍数分别加上其对应提供的5的数量就是题目所需要的答案

进一步思考,由于5的2次方就一定是5的1次方的倍数,而5的3次方一定是5的2次方的倍数,也就是说我们在算5的一次方提供的5的数量的时候,同时把2次方,3次方…n次方的那一份5也算进去了,接着我们在算5的二次方的提供的5的数量的时候,由于已经在一次方算了一次,原本应该需要乘2的这里只需要乘1,类似的,三次方被一次和两次都算了一个5,它原本提供3个5的现在也只需要提供一个5,所以对1,2,3…次方都只需要乘1倍,也就是相当于做加法

一定要理解这段话才能理解下面的代码:

class Solution {
public:
    int trailingZeroes(int n) {
        int ret = 0;
        for (long long i = 5; i <= n; i *= 5) {
            ret += n / i; //只需要加上n / i而不用乘以它对应的提供的5的数量,原因上面解释了
        }
        return ret;
    }
};

这个代码每次i都在乘以5,呈指数的上升速度,所以时间复杂度是对数级别,满足题目要求

### 如何在 VSCode 中安装和配置 LeetCode 插件以及 Node.js 运行环境 #### 安装 LeetCode 插件 在 VSCode 的扩展市场中搜索 `leetcode`,找到官方提供的插件并点击 **Install** 按钮进行安装[^1]。如果已经安装过该插件,则无需重复操作。 #### 下载与安装 Node.js 由于 LeetCode 插件依赖于 Node.js 环境,因此需要下载并安装 Node.js。访问官方网站 https://nodejs.org/en/ 并选择适合当前系统的版本(推荐使用 LTS 版本)。按照向导完成安装流程后,需确认 Node.js 是否成功安装到系统环境中[^2]。 可以通过命令行运行以下代码来验证: ```bash node -v npm -v ``` 上述命令应返回对应的 Node.js 和 npm 的版本号。如果没有正常返回版本信息,则可能未正确配置环境变量。 #### 解决环境路径问题 即使完成了 Node.js 的安装,仍可能出现类似 “LeetCode extension needs Node.js installed in environment path” 或者 “command ‘leetcode.toggleLeetCodeCn’ not found” 的错误提示[^3]。这通常是因为 VSCode 未能识别全局的 Node.js 路径或者本地安装的 nvm 默认版本未被正确加载[^4]。 解决方法如下: 1. 手动指定 Node.js 可执行文件的位置 在 VSCode 设置界面中输入关键词 `leetcode`,定位至选项 **Node Path**,将其值设为实际的 Node.js 安装目录下的 `node.exe` 文件位置。例如:`C:\Program Files\nodejs\node.exe`。 2. 使用 NVM 用户管理工具调整默认版本 如果通过 nvm 工具切换了不同的 Node.js 版本,请确保设置了默认使用的版本号。可通过以下指令实现: ```bash nvm alias default <version> ``` 重新启动 VSCode 后测试功能键是否恢复正常工作状态。 --- #### 配置常用刷题语言 最后一步是在 VSCode 设置面板中的 LeetCode 插件部分定义个人习惯采用的主要编程语言作为默认提交方式之一。这样可以减少频繁修改编码风格的时间成本。 --- ### 总结 综上所述,要在 VSCode 上顺利启用 LeetCode 插件及其关联服务,除了基本插件本身外还需额外准备支持性的后台框架——即 Node.js 应用程序引擎;同时针对特定场景下产生的兼容性障碍采取针对性措施加以修正即可达成目标[^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值