这是悦乐书的第205次更新,第216篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第72题(顺位题号是342)。给定一个整数(带符号的32位),写一个函数来检查它是否为4的幂。例如:

输入:16

输出:true

输入:5

输出:false

跟进:你可以在没有循环/递归的情况下解决它吗?

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况:当num小于等于1时,直接返回num和1是否相等的结果。

正常情况:先判断对4取余是否等于0,如果等于0,则num除以4继续循环,最后判断num是否等于1。

public boolean isPowerOfFour(int num) {
if (num <= 1) {
return num == 1;
}
while (num%4 == 0) {
num /= 4;
}
return num == 1;
}

03 第二种解法

使用递归的方式,判断逻辑和第一种解法一致。

public boolean isPowerOfFour2(int num) {
if (num <= 1) {
return num == 1;
}
if (num > 1 ) {
return num%4 == 0 && isPowerOfFour2(num/4);
}
return false;
}

04 第三种解法

利用Integer.toString(int par1, int par2)方法,将num转成4进制字符串,然后匹配以1开头且尾随k(k>=0)个0的正则。

public boolean isPowerOfFour3(int num) {
return num > 0 && Integer.toString(num, 4).matches("10*");
}

05 第四种解法

将4的所有幂次方整数放入一个HashSet中,然后判断num是否被包含在其中。

public boolean isPowerOfFour4(int num) {
Set<Integer> set = new HashSet<>(Arrays.asList(1, 4, 16, 64, 256, 1024, 4096, 16384, 65536,
262144, 1048576, 4194304, 16777216, 67108864, 268435456, 1073741824));
return num > 0 && set.contains(num);
}

06 第五种解法

使用数学运算中的对数。

4^X == N

log (4^X) == log N

X log 4 == log N

X == (log N) / (log 4)

如果num是4的幂次方,那么将两数取对数后再做除法,得到的是一个以幂次方为整数位,以0位小数位的double类型数,那么对其取整再和自身做减法,那么它的绝对值肯定是无限接近于0的。

public boolean isPowerOfFour5(int num) {
double d = Math.log(num)/Math.log(4);
return Math.abs(d - Math.round(d)) <= 0.00000000001;
}

07 第六种解法

如果num是4的幂次方,那么其二进制数会满足两个条件:

  • 只会有一个1。

  • 后面尾随0的个数是偶数个。

第一个条件借助包装类Integer的bitCount方法,第二个条件依旧借助这个方法,但是对象变成了num-1,统计完1的位数后,对2取余,判断1的个数是否为偶数。

public boolean isPowerOfFour6(int num) {
return num > 0 && Integer.bitCount(num) == 1 && Integer.bitCount(num-1)%2 == 0;
}

08 小结

算法专题目前已连续日更超过两个月,算法题文章72+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Power of Four(Java实现-六种解法)的更多相关文章

  1. LeetCode算法题-Power Of Three(Java实现-七种解法)

    这是悦乐书的第204次更新,第215篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第71题(顺位题号是326).给定一个整数,写一个函数来确定它是否为3的幂.例如: 输入 ...

  2. LeetCode算法题-Power Of Two(Java实现)

    这是悦乐书的第194次更新,第200篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第56题(顺位题号是231).给定一个整数,写一个函数来确定它是否是2的幂.例如: 输入 ...

  3. LeetCode算法题-Rotate String(Java实现)

    这是悦乐书的第317次更新,第338篇原创 在开始今天的算法题前,说几句,今天是世界读书日,推荐两本书给大家,<终身成长>和<禅与摩托车维修艺术>,值得好好阅读和反复阅读. 0 ...

  4. LeetCode算法题-Rotated Digits(Java实现)

    这是悦乐书的第316次更新,第337篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第185题(顺位题号是788).如果一个数字经过180度旋转后,变成了一个与原数字不同的 ...

  5. LeetCode算法题-Toeplitz Matrix(Java实现)

    这是悦乐书的第312次更新,第333篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第181题(顺位题号是766).如果从左上角到右下角的每个对角线具有相同的元素,则矩阵是 ...

  6. LeetCode算法题-Flood Fill(Java实现)

    这是悦乐书的第306次更新,第325篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第173题(顺位题号是733).图像由二维整数数组表示,每个整数表示图像的像素值(从0到 ...

  7. LeetCode算法题-Image Smoother(Java实现)

    这是悦乐书的第282次更新,第299篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第150题(顺位题号是661).给定表示图像灰度的2D整数矩阵M,您需要设计一个平滑器以 ...

  8. LeetCode算法题-Design LinkedList(Java实现)

    这是悦乐书的第300次更新,第319篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第168题(顺位题号是707).设计链表的实现.您可以选择使用单链表或双链表.单链表中的 ...

  9. LeetCode算法题-Design HashMap(Java实现)

    这是悦乐书的第299次更新,第318篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第167题(顺位题号是706).在不使用任何内置哈希表库的情况下设计HashMap.具体 ...

随机推荐

  1. Perl引用入门

    在perl中只有3种基本的数据结构:标量.数组.hash.变量可以是数值,可以是字符串. 这三种基本数据结构的数据存储方式如下: 但是,仅仅由这3种基本结构,就可以构造出更复杂的数据结构,例如hash ...

  2. Spring Boot中如何扩展XML请求和响应的支持

    在之前的所有Spring Boot教程中,我们都只提到和用到了针对HTML和JSON格式的请求与响应处理.那么对于XML格式的请求要如何快速的在Controller中包装成对象,以及如何以XML的格式 ...

  3. 前端(五)之display 总结与浮动

    前端之浮动布局.清浮动 display 总结 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...

  4. C#一个窗体调用另一个窗体的方法

    一个窗体调用另一个窗体的方法:例如:窗体B要调用窗体A中的方法1.首先在窗体A中将窗体A设为静态窗体public static  FormA   m_formA; //设此窗体为静态,其他窗体可调用此 ...

  5. struts2_struts.xml配置文件讲解

    1.bean Bean详细讲解:https://www.cnblogs.com/lulu638/p/4340703.html 2.constant constant属性配置,可配置的属性可以参考def ...

  6. POJ 2484 A Funny Game(智商博弈)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6397   Accepted: 3978 Description Alice ...

  7. CSS3 Transform、Transition和Animation属性总结

    CSS3的三个与变形和动画啊相关的属性: Transform 浏览器支持情况: Internet Explorer 10.Firefox.Opera 支持 transform 属性. Internet ...

  8. 性能优化4--Bitmap内存优化

    1.Bitmap在Android虚拟机中的内存分配 在Android3.0之前,Bitmap的内存分配分为两部分,一部分是分配在Dalvik的VM堆中.而像素数据的内存是分配在Native堆中,而到了 ...

  9. leetcode-13罗马字符转整数

    leetcode-13罗马字符转整数 算法:转换的规律是先逐字符按照对应的阿拉伯数字累加,然后对于特殊的(I.X.C出现在左侧)要处理.处理方法:出现特殊字符组合减去双倍的左侧字符(在开始的处理中已经 ...

  10. 章节七、6-Map集合的区别

    一.通过entrySet取出Map中的元素 package ZangJie7; import java.util.HashMap; import java.util.Map; public class ...