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確實沒那么容易。