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内置函数(39)——locals
英文文档: locals() Update and return a dictionary representing the current local symbol table. Free var ...
- Python内置函数(32)——input
英文文档: input([prompt]) If the prompt argument is present, it is written to standard output without a ...
- BBS论坛(十七)
17.首页导航条实现和代码抽离 (1)temlates/common/_head.html <meta name="csrf-token" content="{{ ...
- [置顶]
xamarin android toolbar(踩坑完全入门详解)
网上关于toolbar的教程有很多,很多新手,在使用toolbar的时候踩坑实在太多了,不好好总结一下,实在浪费.如果你想学习toolbar,你肯定会去去搜索androd toolbar,既然你能看到 ...
- Chapter 5 Blood Type——5
"Well…" He paused, and then the rest of the words followed in a rush. "嗯..." 他顿顿 ...
- 【ASP.NET Core快速入门】(五)命令行配置、Json文件配置、Bind读取配置到C#实例、在Core Mvc中使用Options
命令行配置 我们通过vs2017创建一个控制台项目CommandLineSample 可以看到现在项目以来的是dotnet core framework 我们需要吧asp.net core引用进来,我 ...
- Python使用WMI模块获取Windows系统的硬件信息,并使用pyinstaller库编译打包成exe的可执行文件
由于公司现阶段大多数应用软件都是基于Windows系统开发和部署,很多软件安装部署都是在windows server 2012.windows server 2008之类的服务器上,部门同事每次测试一 ...
- [转]nodejs使用request发送http请求
本文转自:https://blog.csdn.net/dreamer2020/article/details/52074516/ 在nodejs的开发中,有时需要后台去调用其他服务器的接口,这个时候, ...
- 从零开始学安全(三十三)●Ununtu16 LMAP 环境搭建
sudo apt-get update # 获取最新资源包 sudo apt-get upgrade # 本机软件全部更新 sudo apt-get dist-upgrade # 本机系统软件更新 安 ...
- string[]转list<long>,List转字符串
List转字符串,用逗号隔开 List<string> list = new List<string>();list.Add("a");list.Add(& ...