No.0004-CareerCup

You have a bunch of light bulbs. Store them as you wish. Implement a function that tells you if the light is on or off given its index and another one that toggles the state of the light bulbs given a start and end index.
你有一些燈泡,按照你自己的方法存儲。實現一個方法,來確定某個序號的燈泡是否亮著;實現另一個方法,來對給定起始位置和結束位置的燈泡的翻轉(也就是亮的變關,關的變亮)。

1. 詢問

序號從0開始還是1?假設是0.序號有沒有可能小于0或者大于最大index?假設不能。

2. 分析

直觀解法

一個非常直觀的解法就是存儲到數組里面,這樣查找是O(n),翻轉也是O(n)。空間復雜度O(n)。

如何改進

首先可以想到哈希表。使用哈希表,可以把查找降低為O(1)。但是翻轉還是要遍歷所有元素,O(n)。空間復雜度O(n)。
有沒有更好的方法?考慮到燈泡只有兩個狀態,對應二進制比特,可以從這方面考慮。

二進制解法

假如有n個燈泡,那么可以表示為n位二進制數b,但是要注意溢出。這方面可以和面試官確認一下。和所用的語言有關,比如Python就無需考慮溢出。
那么,整個問題就轉化為Bit Manipulation了。
確認序號為k的燈泡的狀態,就是獲取第k位二進制的值,即:b&(1<<k)>0,可以規定1代表亮,0代表關,那么這個結果自然就能表示亮或者關。
對起始位置s和結束位置e的燈泡進行翻轉,首先獲取從起始位置到結束位置的mask:1<<(e+1)-1<<s,然后用b與其異或即可,因為與1異或取反,與0異或不變。b^((1<<(e+1))-(1<<s))。
時間復雜度都是O(1),空間復雜度O(1)。

3. 代碼

class Solution:
    def __init__(self):
        self.b = 0

    def getLight(self, k):
        return self.b & (1 << k) > 0

    def reverseLight(self, s, e):
        self.b ^= ((1 << (e + 1)) - (1 << s))

4. 總結

難度medium,因為短時間內反應過來而且做到bug free確實沒那么容易。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容