LeetCode算法题-Perfect Number(Java实现)
这是悦乐书的第249次更新,第262篇原创
01 看题和准备
今天介绍的是LeetCode算法题中Easy级别的第116题(顺位题号是507)。我们定义Perfect Number是一个正整数,它等于除了它自己之外的所有正除数之和。现在,给定一个整数n,编写一个函数,当它是一个完美数字时返回true,否则返回false。例如:
输入:28
输出:true
说明:28 = 1 + 2 + 4 + 7 + 14
注意:输入数字n不会超过100,000,000。(1E8)
本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。
02 第一种解法
特殊情况:最小Perfect Number为6,奇数不可能是Perfect Number
正常情况:num对从2开始的正整数做取余操作,等于0,就表示能够被整除,将能够被整除的数累加起来,最后判断与num是否相等。在循环中,我们可以将num除以2再判断,而不必一直遍历到num,因为超过num/2的数再乘以另外一个数(1除外)肯定会大于num。
此解法的时间复杂度是O(n),其中n只用判断n/2次,空间复杂度是O(1)。
public boolean checkPerfectNumber(int num) {
if (num < 6 || num%2 != 0) {
return false;
}
int sum = 1;
for (int i=2; i<=num/2; i++) {
if (num%i == 0) {
sum += i;
}
}
return sum == num;
}
03 第二种解法
我们是不是可以将for循环中的循环次数再缩小一点?第一种解法是num/2次,而一个正整数它所包含的因子,两两相乘,当两因子无限逼近的时候,就是正整数的平方根,但是使用平方根作为循环次数的上限,会把右边的因子排除掉,所以我们需要提前就加进去,当num能被当前因子整除时,它的商就是右边的一个因子,所以需要将两个因子都加上。最后还是判断因子之和是否与num相等。
此解法的时间复杂度是O(n),其中n只用判断根号n次,空间复杂度是O(1)。
public boolean checkPerfectNumber2(int num) {
if (num < 6 || num%2 != 0) {
return false;
}
int sum = 1;
for (int i=2; i<=Math.sqrt(num); i++) {
if (num%i == 0) {
sum += i + num/i;
}
}
return sum == num;
}
04 第三种解法
最小的Perfect Number是6,接着是28,然后是496
6: 2x3 true
28: 4x7 true
120: 8x15 false
496: 16x31 true
2016: 32x63 false
8128: 64x127 true
上面这些数,可以看做2的(n-1)次方与2的n次方再减1的乘积,其中n从2开始,但是并非所有的n都符合,在上面几个数中,当n等于4和6时是不符合Perfect Number的,这里直接给出符合的数吧,2,3,5,7,13,17,19,31,至于17,19,31这几个次方数,做乘法会溢出,可以直接不考虑,至于为什么是这几个数,可以一个一个往下推,不难。当然,你要是把int范围内的5个Perfect Number(第5个是33550336)都找出来了,直接做判断也行。
public boolean checkPerfectNumber3(int num) {
int[] primes = {2,3,5,7,13};
for (int p: primes) {
if ((1 << (p - 1)) * ((1 << p) - 1) == num) {
return true;
}
}
return false;
}
05 小结
算法专题目前已日更超过三个月,算法题文章116+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!
LeetCode算法题-Perfect Number(Java实现)的更多相关文章
- LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)
这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...
- LeetCode算法题-Largest Number At Least Twice of Others(Java实现)
这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747).在给定的整数数组中,总有一个最大的元素.查找数组中的最大 ...
- LeetCode算法题-Binary Number with Alternating Bits(Java实现)
这是悦乐书的第292次更新,第310篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第160题(顺位题号是693).给定正整数,检查它是否具有交替位:即它的二进制数的任意两 ...
- LeetCode算法题-Fibonacci Number(Java实现)
这是悦乐书的第250次更新,第263篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第117题(顺位题号是509).Fibonacci数字,通常表示为F(n),形成一个称为 ...
- LeetCode算法题-Guess Number Higher or Lower(Java实现)
这是悦乐书的第211次更新,第224篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第79题(顺位题号是374).我们正在玩数字游戏. 游戏如下:我从1到n中选择一个数字. ...
- LeetCode算法题-Missing Number(Java实现-四种解法)
这是悦乐书的第200次更新,第209篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第65题(顺位题号是268).给定一个包含n个不同数字的数组,取自0,1,2,...,n ...
- LeetCode算法题-Ugly Number(Java实现-四种解法)
这是悦乐书的第199次更新,第208篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第64题(顺位题号是263).编写一个程序来检查给定的数字是否是一个丑陋的数字.丑陋的数 ...
- LeetCode算法题-Happy Number(Java实现)
这是悦乐书的第188次更新,第190篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第47题(顺位题号是202).编写算法以确定数字是否"幸福". 幸福 ...
- LeetCode算法题-Single Number(Java实现)
这是悦乐书的第175次更新,第177篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第34题(顺位题号是136).给定一个非空的整数数组,除了一个元素外,每个元素都会出现两 ...
随机推荐
- Python内置函数(63)——super
英文文档: super([type[, object-or-type]]) Return a proxy object that delegates method calls to a parent ...
- 实现网站页面的QQ临时会话,分享到空间微博等按钮.
一 qq临时会话 要实现qq临时会话首先要到qq在线状态官网开通qq在线状态,其中临时对话也分为加密和未加密. 1.1:加密模式 <a target="_blank" hre ...
- C#版(打败97.89%的提交) - Leetcode 202. 快乐数 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- shell实战之Linux主机系统监控
1.系统监控概述 采集的监控信息主要有内存占用率,CPU占用率,当前在线用户,磁盘挂载及磁盘空间使用率,平均每秒写入流量,平均每秒流出流量.磁盘IO:平均每秒从磁盘读入内存的速率,平均每秒从内存写入磁 ...
- iOS逆向开发(7):微信伪装他人
上一节小程介绍了微信在进入"附近的人"时修改位置信息的办法,这一次,小程来修改"自己"的信息,伪装成别人. 但是,这里的伪装只是"本地的伪装" ...
- Oracle 查询结果集行数分析
本人曾去某金融软件公司面试,交流中面试官问的一个问题是:"如果有 A.B 两张表,A 表中有 2 条数据,B 表中有 200 条数据,请问 SELECT * FROM A,B 能查出多少条数 ...
- 补习系列(7)-springboot 实现拦截的五种姿势
目录 简介 姿势一.使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二.HanlderInterceptor 姿势三.@Exc ...
- Windows 下常见的反调试方法
稍稍总结一下在Crack或Rervese中比较常见的一些反调试方法,实现起来也比较简单,之后有写的Demo源码参考,没有太大的难度. ①最简单也是最基础的,Windows提供的API接口:IsDebu ...
- Oracle最新的Sql笔试题及答案
部门表(SM_DEPT) 字段名称 数据类型 是否主键 注释 DEPT_ID NUMBER Y 部门ID PARENT_DEPARTMENT_ID NUMBER N 上级部门 DEPARTMENT_N ...
- 转换Word文档为PDF文件
1.使用 Office COM组件的Microsoft.Office.Interop.word.dll库 该方法需要在电脑上安装Office软件,并且需要Office支持转换为PDF格式,如果不支持, ...