1018. 題目如下在這裡插入**片給定由若干 0 和 1 組成的陣列 a。我們定義 n_i:從 a[0] 到 a[i] 的第 i個子陣列被解釋為乙個二進位制數(從最高有效位到最低有效位)。返回布林值列表 answer,只有當 n_i 可以被 5 整除時,答案 answer[i] 為 true,否則為 false。
示例 1:輸入:[0,1,1] 輸出:[true,false,false] 解釋: 輸入數字為 0, 01, 011;也就是十進位制中的 0, 1, 3
。只有第乙個數可以被 5 整除,因此 answer[0] 為真。
示例 2:輸入:[1,1,1] 輸出:[false,false,false]
示例 3: 輸入:[0,1,1,1,1,1] 輸出:[true,false,false,false,true,false]在這裡先做乙個數學推導:
m ÷a
=n..
....
bm \div a = n ...... b
m÷a=n.
....
.b那麼2m÷
a=2n
....
....
2b2 m \div a = 2 n ........2 b
2m÷a=2
n...
....
.2b當然這是很不嚴謹的寫法
如果我們只關心餘數,則
c m÷
a=(c
n+⌊c
ba⌋)
....
....
[(cb
)%a]
cm \div a = (cn + \left\lfloor\frac\right\rfloor)........[ (cb)\%a ]
cm÷a=(
cn+⌊
acb
⌋)..
....
..[(
cb)%
a]( d+
m)÷a
=(n+
⌊d+b
a⌋).
....
..[(
d+b)
%a](d+m) \div a = (n + \left\lfloor\frac\right\rfloor).......[(d+b)\%a]
(d+m)÷
a=(n
+⌊ad
+b⌋
)...
....
[(d+
b)%a
]與本題的聯絡
示例 3: 輸入:[0,1,1,1,1,1] 輸出:[true,false,false,false,true,false]二進位制陣列為」0「,能被5整除,餘數為0
原二進位制陣列<<1 (即乘2),後加一,則餘數為 (2*0 + 1)% 5 = 1
同推導公式,餘數為 (2*1+1)%5 = 3
(2*3+1)%5 = 2
(2*2+1)%5 = 0
(2*0+1)%5 = 1
則我們可以定義狀態機機狀態轉移:
class
solution
(object):
defprefixesdivby5
(self, a)
:"""
:type a: list[int]
:rtype: list[bool]
"""ans =
transitionarr =[[
0,2,
4,1,
3],[
1,3,
0,2,
4]]if a[0]
==0:true
)else
:false
) prev = a[0]
for i in
range(1
,len
(a))
: modulus = transitionarr[a[i]
][prev]
if modulus ==0:
true
)else
:false
) prev = modulus
return ans
1018 可被 5 整除的二進位制字首
解題思路 1.可被 5 整除的數個位必然是0或5,所以,我們實際上可以不用關心,各位累加後的結果,我們關心的只是個位 2.原陣列的第i個子陣列組成的十進位制數字的計算方法是 sum 1 a i 其中sum的初始值為0,這樣計算得到的sum實際上超出了int和long型別的範圍,由於我們只關心個位的數...
1018 可被5整除的二進位制字首
給定由若干 0 和 1 組成的陣列 a。我們定義 n i 從 a 0 到 a i 的第 i 個子陣列被解釋為乙個二進位制數 從最高有效位到最低有效位 返回布林值列表 answer,只有當 n i 可以被 5 整除時,答案 answer i 為 true,否則為 false。示例輸入 0,1,1 輸出...
1018 可被 5 整除的二進位制字首
題目描述 給定由若干 0 和 1 組成的陣列 a。我們定義 n i 從 a 0 到 a i 的第 i 個子陣列被解釋為乙個二進位制數 從最高有效位到最低有效位 返回布林值列表 answer,只有當 n i 可以被 5 整除時,答案 answer i 為 true,否則為 false。示例 1 輸入 ...