LeetCode172. 阶乘后的零(2024秋季每日一题 1)

news/2024/10/18 12:34:36/

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

提示 n ! = n ∗ ( n − 1 ) ∗ ( n − 2 ) ∗ . . . ∗ 3 ∗ 2 ∗ 1 n! = n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 n!=n(n1)(n2)...321

示例 1:

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

示例 2:

输入:n = 5
输出:1
解释:5! = 120 ,有一个尾随 0

示例 3:

输入:n = 0
输出:0

提示:

0 < = n < = 1 0 4 0 <= n <= 10^4 0<=n<=104

进阶: 你可以设计并实现对数时间复杂度的算法来解决此问题吗?


暴力枚举:

可以发现在乘的过程中,末尾 0 的个数总是增加的,所以可以考虑每乘一次,就将对应的末尾 0 计数,然后消除掉末尾 0,这样可以防止溢出
比如:120 * 5 = (12 * 5)0 = 600

优化:看代码,利用 10 的倍数取余,防止溢出,并且使得末尾 0 的个数不变
比如: x = 13859448592385 x = 13859448592385 x=13859448592385,但是后面的乘积是否有0,和末尾的最后几位数有关,可以只取最后几位

时间复杂度: O ( N l o g N ) O(NlogN) O(NlogN)
空间复杂度: O ( 1 ) O(1) O(1)

class Solution {
public:int trailingZeroes(int n) {unsigned long long x = 1;long long res = 0;for(int i = 1; i <= n; i++){x *= i;if(x > 1000000) x = x % 1000000;while(x % 10 == 0) res++, x /= 10;}return res;}
};

利用数学知识推导:

1 ∗ 2 ∗ 3 ∗ 4... ∗ n 1*2*3*4...*n 1234...n 的乘积,能产生末尾0的只有 ( 2 或 2 的倍数 ∗ 5 或 5 的倍数 ) (2或2的倍数 * 5或5的倍数) (22的倍数55的倍数) 可以,所以只需要找到乘积里面有多少对 ( 2 ∗ 5 ) (2*5) (25),并且 2 的倍数 2的倍数 2的倍数 的个数肯定是 多于 5 的倍数 5的倍数 5的倍数,所以只需要找乘积里有多少个 5 即可
1 ∗ 2 ∗ 3 ∗ 4... ∗ n = 1 ∗ 2 ∗ . . ( 1 ∗ 5 ) . . ( 2 ∗ 5 ) . . ( 3 ∗ 5 ) . . . ( 4..5 ) . . . ( 5 ∗ 5 ) . . . . ( 5 ∗ 5 ∗ 5 ) . . . 1*2*3*4...*n = 1 * 2 *..(1*5)..(2*5)..(3*5)...(4..5)...(5*5)....(5*5*5)... 1234...n=12..(15)..(25)..(35)...(4..5)...(55)....(555)...,像 5 ∗ 5 5*5 55 其实是可以贡献 两个5 的(即贡献两个末尾0),所以只需要对 5 的倍数,计算出每个 5 的倍数能贡献几个 5,求出总和,就是 末尾0 的个数

时间复杂度: O ( N l o g N ) O(NlogN) O(NlogN)
空间复杂度: O ( 1 ) O(1) O(1)

class Solution {
public:int trailingZeroes(int n) {long long res = 0;for(int i = 5; i <= n; i+=5){int x = i;while(x % 5 == 0) res++, x /= 5;}return res;}
};

http://www.ppmy.cn/news/1514270.html

相关文章

位运算专题

分享丨【题单】位运算&#xff08;基础/性质/拆位/试填/恒等式/思维&#xff09; - 力扣&#xff08;LeetCode&#xff09; Leetcode 3133. 数组最后一个元素的最小值 我的答案与思路&#xff1a; class Solution { public: // 4 --> (100)2 7 --> (0111)2 // 5 --&g…

Vue 导航条+滑块效果

目录 前言代码效果展示导航实现代码导航实现代码导航应用代码前言 总结一个最近开发的需求。设计稿里面有一个置顶的导航条,要求在激活的项目下面展示个下划线。我最先开始尝试的是使用 after 的伪类选择器,直接效果一样,但是展示的时候就会闪现变化,感觉不够自然,参考了一…

Python——序列及常见操作

序列 Python 中的序列&#xff08;Sequence&#xff09;是一种基础的数据结构&#xff0c;用于存储一系列的元素。这些元素之间可以通过索引&#xff08;index&#xff09;进行访问&#xff0c;索引通常是从 0 开始的。Python 中有几种内置的序列类型&#xff0c;它们各自拥有…

Linux入门——08 进程间通讯——管道

1.进程间通讯 1.1什么是通讯 进程具有独立性&#xff08;每个进程都有自己的PCB,独立地址空间&#xff0c;页表&#xff09;但是要进行进程的通信&#xff0c;通信的成本一定不低&#xff0c;打破了独立性 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给…

[数据集][目标检测]电力场景轭式悬架锈蚀分类数据集6351张2类别

数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;6351 分类类别数&#xff1a;2 类别名称[corrosion,good] 每个类别图片数&#xff1a; corrosion 图片数&#xff1a;310 good 图片数&#xff1a;6041 …

【Python】SQLAlchemy:快速上手

ORM&#xff08;对象关系映射&#xff09; 是一种编程技术&#xff0c;用于将面向对象编程中的对象模型与关系数据库中的表结构相映射。它的主要目标是简化数据库操作&#xff0c;使得开发者能够使用面向对象的方式来操作数据库&#xff0c;而不必直接编写 SQL 语句。ORM 通过将…

最全Java集合分片处理!!! Java 中 List 分片的 7种方法

文章目录 Java 中 List 分片的 7种方法业务需求背景实现方法方法一&#xff1a;最基本的 for 循环实现方法二&#xff1a;利用 List 的 subList() 方法方法三&#xff1a;stream 流操作 filter 方法过滤方法四&#xff1a;使用 Google Guava 的 Lists.partition 方法方法五&…

Spring Boot 实现全局异常处理

在Spring Boot中&#xff0c;实现全局异常处理是一个常见的需求&#xff0c;它可以帮助我们集中处理应用中可能抛出的异常&#xff0c;并返回统一的响应格式给前端。这不仅可以减少代码重复&#xff0c;还能提高应用的可维护性和用户体验。 下面是一个简单的Spring Boot全局异…