?LeetCode刷題實(shí)戰(zhàn)393:UTF-8 編碼驗(yàn)證


示例
示例 1:
data = [197, 130, 1], 表示 8 位的序列: 11000101 10000010 00000001.
返回 true 。
這是有效的 utf-8 編碼,為一個2字節(jié)字符,跟著一個1字節(jié)字符。
示例 2:
data = [235, 140, 4], 表示 8 位的序列: 11101011 10001100 00000100.
返回 false 。
前 3 位都是 1 ,第 4 位為 0 表示它是一個3字節(jié)字符。
下一個字節(jié)是開頭為 10 的延續(xù)字節(jié),這是正確的。
但第二個延續(xù)字節(jié)不以 10 開頭,所以是不符合規(guī)則的。
解題
from typing import List
class Solution:
# 獲取x的二進(jìn)制表示從右開始計(jì)算的第k位數(shù)字
def get(self, x: int, k: int):
return x >> k & 1
def validUtf8(self, data: List[int]) -> bool:
i = 0
while i < len(data):
# 獲取當(dāng)前這個數(shù)字的二進(jìn)制表示中第七位是否是1判斷是幾個字節(jié)
if self.get(data[i], 7) == 0:
i += 1
continue
k = 0
# 計(jì)算當(dāng)前對應(yīng)的二進(jìn)制數(shù)字最高位開始連續(xù)的1的數(shù)目
while k <= 4 and self.get(data[i], 7 - k): k += 1
if k == 1 or k > 4: return False
# k表示后面需要有k - 1個10的
for j in range(k - 1):
t = i + j + 1
# 注意需要判斷下面這一句代碼
if t >= len(data): return False
if t < len(data):
if not (self.get(data[t], 7) == 1 and self.get(data[t], 6) == 0): return False
i = i + k
# 更新下一次需要判斷的數(shù)字
return True
LeetCode1-380題匯總,希望對你有點(diǎn)幫助!
LeetCode刷題實(shí)戰(zhàn)381:O(1) 時間插入、刪除和獲取隨機(jī)元素
LeetCode刷題實(shí)戰(zhàn)382:鏈表隨機(jī)節(jié)點(diǎn)
LeetCode刷題實(shí)戰(zhàn)383:贖金信
LeetCode刷題實(shí)戰(zhàn)384:打亂數(shù)組
LeetCode刷題實(shí)戰(zhàn)385:迷你語法分析器
