首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 231:2 的冪次方判定 - 位運算與迭代雙解法

     編輯:關於C++

問題描述

給定一個整數,編寫函數判斷其是否為 2 的冪次方(即 2^k, k ≥ 0)。

方法一:位運算(最優解)

核心性質:2 的冪次方在二進制中只有最高位為 1,其餘為 0(如 8 = 1000₂)。n-1 則是最高位變 0,其餘變 1(7 = 0111₂)。因此 n & (n-1) == 0 可判斷是否為 2 的冪次方。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n <= 0) return false;
        return (n & (n - 1)) == 0;
    }
};

方法二:迭代除以 2

不斷除以 2,若過程中出現餘數非 0 且商不為 1,則非 2 的冪次方。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        if (n <= 0) return false;
        while (n > 1) {
            if (n % 2 != 0) return false;
            n /= 2;
        }
        return true;
    }
};

方法三:數學性質(整數範圍內)

32 位有號整數最大的 2 的冪次方為 2^30 = 1073741824。若 n > 0 且 1073741824 % n == 0,則 n 為 2 的冪次方。

class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n > 0 && 1073741824 % n == 0;
    }
};

複雜度分析

方法時間複雜度空間複雜度優缺點
位運算O(1)O(1)最快、最優雅
迭代O(log n)O(1)直觀易懂
數學取模O(1)O(1)利用整數範圍上限

測試範例

2的冪次方二進制示意圖

  • 1 (2^0) → true
  • 16 (2^4) → true
  • 3 → false
  • 0 → false
  • -16 → false
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved