LeetCode刷题实战393:UTF-8 编码验证
共 3739字,需浏览 8分钟
·
2021-10-01 23:53
示例
示例 1:
data = [197, 130, 1], 表示 8 位的序列: 11000101 10000010 00000001.
返回 true 。
这是有效的 utf-8 编码,为一个2字节字符,跟着一个1字节字符。
示例 2:
data = [235, 140, 4], 表示 8 位的序列: 11101011 10001100 00000100.
返回 false 。
前 3 位都是 1 ,第 4 位为 0 表示它是一个3字节字符。
下一个字节是开头为 10 的延续字节,这是正确的。
但第二个延续字节不以 10 开头,所以是不符合规则的。
解题
from typing import List
class Solution:
# 获取x的二进制表示从右开始计算的第k位数字
def get(self, x: int, k: int):
return x >> k & 1
def validUtf8(self, data: List[int]) -> bool:
i = 0
while i < len(data):
# 获取当前这个数字的二进制表示中第七位是否是1判断是几个字节
if self.get(data[i], 7) == 0:
i += 1
continue
k = 0
# 计算当前对应的二进制数字最高位开始连续的1的数目
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
# 更新下一次需要判断的数字
return True
LeetCode刷题实战381:O(1) 时间插入、删除和获取随机元素