LeetCode*342. Power of Four

LeetCode題目

題目:

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.

解析:

使用二進(jìn)制來考慮問題。
因?yàn)槭?2位有符號(hào)數(shù),所以先保證num > 0。一個(gè)數(shù)是4的冪必然是2的冪,先來看看2的冪的特征(num & (num - 1)) == 0

比如數(shù)字8:(8 & 7) --> (0x1000 & 0x0111)。所有是2的冪的數(shù)n都滿足二進(jìn)制位只有一個(gè)1,后面都是0。(n-1)滿足全為1。

再在2的冪中篩選去掉不是4的冪的。
4的冪的二進(jìn)制中1總是出現(xiàn)在奇數(shù)位,比如:4^1(0x0100), 4^2(0x00010000), 4^3(0x01000000)
其他則是在偶數(shù)位,比如 2^1(0x0010), 2^3(0x1000), 2^5(0x00100000)
所以要滿足(num & 0x55555555) != 0,這里0x555555550b 0101 0101 0101 0101 0101 0101 0101 0101)正是32位有符號(hào)整數(shù)。

答案一:

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

答案二(基礎(chǔ)解法):

class Solution {
public:
    bool isPowerOfFour(int num) {
        if (num == 1) {
            return true;
        }
        
        if (num == 0) {
            return false;
        }
        
        while ( (num % 4 == 0)) {
            num /= 4;
            if (num == 1) {
                return true;
            }
        }
        
        return false;
    }
};
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 問題描述 Given an integer (signed 32 bits), write a function ...
    如煙花非花閱讀 358評(píng)論 0 0
  • 原題 給出一個(gè)整數(shù) (32 位), 寫出一個(gè)函數(shù)判斷它是不是4的次方數(shù) 樣例:給出 num = 16, 返回 tr...
    Jason_Yuan閱讀 309評(píng)論 0 0
  • 分析 一共有2種比較巧妙的方法,前提是首先確定是2的冪次。 4的冪次減1可以被3整除。 檢查數(shù)字的偶數(shù)位是否有1。...
    胡哈哈哈閱讀 291評(píng)論 0 0
  • 今天是2016年的最后一天,雖然我們都喜歡以春節(jié)為一年的結(jié)束,但是事實(shí)上明天新的一年就要開始了,每每春節(jié)過后,新一...
    蓮葦閱讀 554評(píng)論 0 1
  • 天突然變冷,中午還下起了大雪。薄衫單衣在雪里走了一遭回來竟然有點(diǎn)發(fā)暈,鼻涕直流。羽絨棉襖都已經(jīng)洗好收進(jìn)了柜子,懶得...
    覺夢2016閱讀 294評(píng)論 0 1