[LeetCode] Power of Four 判断4的次方数

简介:

Given an integer (signed 32 bits), write a function to check whether it is a power of 4.

Example:
Given num = 16, return true. Given num = 5, return false.

Follow up: Could you solve it without loops/recursion?

Credits:
Special thanks to @yukuairoy for adding this problem and creating all test cases.

这道题让我们判断一个数是否为4的次方数,那么最直接的方法就是不停的除以4,看最终结果是否为1,参见代码如下:

解法一:

class Solution {
public:
    bool isPowerOfFour(int num) {
        while (num && (num % 4 == 0)) {
            num /= 4;
        }
        return num == 1;
    }
};

还有一种方法是跟Power of Three中的解法三一样,使用换底公式来做,讲解请参见之前那篇博客:

解法二:

class Solution {
public:
    bool isPowerOfFour(int num) {
        return num > 0 && int(log10(num) / log10(4)) - log10(num) / log10(4) == 0;
    }
};

下面这种方法是网上比较流行的一种解法,思路很巧妙,首先根据Power of Two中的解法二,我们知道num & (num - 1)可以用来判断一个数是否为2的次方数,更进一步说,就是二进制表示下,只有最高位是1,那么由于是2的次方数,不一定是4的次方数,比如8,所以我们还要其他的限定条件,我们仔细观察可以发现,4的次方数的最高位的1都是计数位,那么我们只需与上一个数(0x55555555) <==> 1010101010101010101010101010101,如果得到的数还是其本身,则可以肯定其为4的次方数:

解法三:

class Solution {
public:
    bool isPowerOfFour(int num) {
        return num > 0 && !(num & (num - 1)) && (num & 0x55555555) == num;
    }
};

或者我们在确定其是2的次方数了之后,发现只要是4的次方数,减1之后可以被3整除,所以可以写出代码如下:

解法四:

class Solution {
public:
    bool isPowerOfFour(int num) {
        return num > 0 && !(num & (num - 1)) && (num - 1) % 3 == 0;
    }
};

本文转自博客园Grandyang的博客,原文链接:判断4的次方数[LeetCode] Power of Four ,如需转载请自行联系原博主。

相关文章
LeetCode 342. Power of Four
给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方。
55 0
LeetCode 342. Power of Four
|
JavaScript
代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列
代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列
代码随线录刷题|LeetCode 392.判断子序列 115.不同的子序列
LeetCode每日一题——1704. 判断字符串的两半是否相似
给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。
74 0
|
Java
java学习第四天笔记-流程控制语句-分支结构82-判断和循环次数-回文数leetcode求商和余数
java学习第四天笔记-流程控制语句-分支结构82-判断和循环次数-回文数leetcode求商和余数
57 0
java学习第四天笔记-流程控制语句-分支结构82-判断和循环次数-回文数leetcode求商和余数
|
Java
java学习第四天笔记-流程控制语句-分支结构81-判断和循环次数-回文数leetcode
java学习第四天笔记-流程控制语句-分支结构81-判断和循环次数-回文数leetcode
54 0
java学习第四天笔记-流程控制语句-分支结构81-判断和循环次数-回文数leetcode
|
存储
|
数据库
LeetCode(数据库)- 判断三角形
LeetCode(数据库)- 判断三角形
85 0
|
算法 索引 Python
Leetcode刷题指南之Python求两数之和【多种思路详解】,判断是否为回文数【将整数转为字符串】【不转为字符串】
两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。 你可以按任意顺序返回答案。
361 1
Leetcode刷题指南之Python求两数之和【多种思路详解】,判断是否为回文数【将整数转为字符串】【不转为字符串】