1018 可被5整除的二進位制字首

2021-10-20 01:21:43 字數 1745 閱讀 3060

給定由若干 0 和 1 組成的陣列 a。我們定義 n_i:從 a[0] 到 a[i] 的第 i 個子陣列被解釋為乙個二進位制數(從最高有效位到最低有效位)。

返回布林值列表 answer,只有當 n_i 可以被 5 整除時,答案 answer[i] 為 true,否則為 false。

示例

輸入:[0,1,1]

輸出:[true,false,false]

解釋:輸入數字為 0, 01, 011;也就是十進位制中的 0, 1, 3 。只有第乙個數可以被 5 整除,因此 answer[0] 為真。

輸入:[1,1,1]

輸出:[false,false,false]

輸入:[0,1,1,1,1,1]

輸出:[true,false,false,false,true,false]

輸入:[1,1,1,0,1]

輸出:[false,false,false,false,false]

如已知a=[0,1,0],變換 b=['0', '1', '0'],變換c=['0', '01', '010'],之後將c中每個值進行判斷即可。

class solution:

def prefixesdivby5(self, a: list[int]) -> list[bool]:

list = a # 初始化list

str_a = [str(i) for i in a] # 將a轉換成字串陣列

if a[0] == 0: # 判斷第乙個數字是否符合

list[0] = true

else: list[0] = false

if len(str_a) == 1:

return list

else:

str_res = str_a # str_res初始化

str_res[0] = str_a[0]

for j in range(1, len(str_a)):

str_res[j] = str_res[j-1] + str_a[j]

int_res = int(str_res[j],2)

if int_res % 5 == 0:

list[j] = true

else: list[j] = false

return list

在進行**優化前,我們先從數學角度進行分析,會得出如下結論:

設\(n_i\)為a中從下標0到下標i構成的二進位制數,則有:

所以,我們可以將上面「數字-字串-數字」的過程變成上面遞推公式的計算。但是這個思路存在的問題:考慮到陣列a可能很長,如果每次都保留\(n_i\)的值,則可能導致溢位。

解決方案:\(m_i=n_i mod 5=(n_ *2 + a[i])mod5=(m_ *2 + a[i])mod5\),即可以用餘數代替n完成運算。

在上面思路的基礎上,**如下:

class solution:

def prefixesdivby5(self, a: list[int]) -> list[bool]:

ans = list()

prefix = 0

for num in a:

prefix = ((prefix << 1) + num) % 5

return ans

prefix初始化為0,0<<1左移的結果仍然是0。

本題側重於數學分析,如果分析不到位,會出現兩種情況:

1018 可被 5 整除的二進位制字首

解題思路 1.可被 5 整除的數個位必然是0或5,所以,我們實際上可以不用關心,各位累加後的結果,我們關心的只是個位 2.原陣列的第i個子陣列組成的十進位制數字的計算方法是 sum 1 a i 其中sum的初始值為0,這樣計算得到的sum實際上超出了int和long型別的範圍,由於我們只關心個位的數...

1018 可被 5 整除的二進位制字首

1018.題目如下在這裡插入 片給定由若干 0 和 1 組成的陣列 a。我們定義 n i 從 a 0 到 a i 的第 i個子陣列被解釋為乙個二進位制數 從最高有效位到最低有效位 返回布林值列表 answer,只有當 n i 可以被 5 整除時,答案 answer i 為 true,否則為 fals...

1018 可被 5 整除的二進位制字首

題目描述 給定由若干 0 和 1 組成的陣列 a。我們定義 n i 從 a 0 到 a i 的第 i 個子陣列被解釋為乙個二進位制數 從最高有效位到最低有效位 返回布林值列表 answer,只有當 n i 可以被 5 整除時,答案 answer i 為 true,否則為 false。示例 1 輸入 ...