1. 程式人生 > >7 交替的二進位制位 Binary Number with Alternating Bits

7 交替的二進位制位 Binary Number with Alternating Bits

題很簡單,一眼就知道是關於二進位制運算的,而且我在第一時間就發現符合條件的整數,與它的左移1位後的結果相加,除了尾數全為1.十進位制考慮的話,即整數n需滿足n + (n<<1) = 2^i-1-i//2。
但是實現上有些問題
首先放上失敗程式碼:

class Solution:
   
    def hasAlternatingBits(self, n):
        # Write your code here
        t = (n<<1) + n 
        i = 0
        ass = 0#設定的外部變數, 記錄迴圈結果。其實最好是布林變數
        for i in range(t): #這裡的範圍設定有問題,但是暫時不知道如何解決
            if (pow(2,i) -1)-(i%2) == t:
                ass = 1
            else:
                i + 1 
        return ass == 1

小範圍內程式碼無誤,但是時間複雜度不過關。難點
1 可以判斷某個數是否是2的冪(n /= 2),但是這對於公式(即之前說到的那個規律)是不適用的
2 數學方法上應該有限制某個數 m 使得2^m剛好不大於數字t,但是這個的程式碼實現又很複雜。這就是典型的“我有一個問題,有一個巧妙的方法去解決,於是我就有了兩個問題”
3 如果用二進位制考慮的話,“二進位制最後一位的0 1 與位數的關係”…好像不難實現…

這裡因為題是英文,所以網上沒找到合適的程式碼。又因為解決這個拖了太久,所以準備暫時跳過,留待以後二進位制運算熟悉了再解決。

先總結下目前的收穫:
1 有個東西需要用迴圈判斷,輸出true false,但是不想每次迴圈都輸出一次。這時候就設定外部變數。
就是說假如需要判斷傑傑哪一年有女朋友,然後從1到現在250歲開始迴圈。每年都沒有,所以每次都輸出一句“傑傑沒有女朋友”輸出250次。但是這樣看那麼多遍就很礙眼,只想迴圈1-250去判斷,不想它輸出那一句250遍,一遍就夠了。
這時候設定外部變數。
2 Python的運算順序跟我下意識的考慮是不一樣的,比如n+n<<1 其實是(n+n)<<1,所以運算的時候不能少加括號。