題目描述:給定一個正整數 n,判斷其二進位表示中,相鄰位是否全部不同(即 0 和 1 交替出現,例如 101010 或 010101)。
解題思路:利用位元操作的技巧,一步完成判斷。
若 n 的二進位表示是交替位(例如 101010),則 n >> 1 會是 010101。兩者做 XOR 後,結果 x = n ^ (n >> 1) 將是一串連續的 1(例如 111111)。
一個數 x 的所有位都是 1 等價於 x + 1 是 2 的冪次(即 x & (x + 1) == 0)。因此只需驗證:
x = n ^ (n >> 1)x & (x + 1) == 0,回傳 true;否則回傳 false。這個方法完全基於位元操作,無需迴圈,O(1) 完成。
時間複雜度:O(1) — 只用常數次位元操作,與輸入值的大小無關。
空間複雜度:O(1) — 只使用一個額外變數 x。
Function hasAlternatingBits(n):
x = n XOR (n right-shift 1)
If (x AND (x + 1)) equals 0:
Return true
Else:
Return false逐位元檢查 O(log n):用迴圈依序取出每一位元,與前一位元比較。若發現相鄰兩位相同則回傳 false,全部通過則回傳 true。實作直觀易懂,但需要 O(log n) 的迴圈迭代次數。
字串轉換法 O(log n):將整數轉為二進位字串,逐一比對相鄰字元。程式碼可讀性高,但涉及字串分配,常數係數較大,且不夠「位元風格」。
預建查表法 O(1):由於交替位整數的數量有限(在 32 位元範圍內僅有 10, 01, 101, 010, ...等,共 30 個),可預先建立一個集合,直接查詢 n 是否在集合中。雖然時間複雜度也是 O(1),但需要維護一個常數表,不如 XOR 方法優雅。
long long?