1 class Solution:
 2     def validUtf8(self, data):
 3         # 标记这个字节是某个编码的第几个字节
 4         n_bytes = 0
 5 
 6         # 遍历数组
 7         for num in data:
 8 
 9             # 获取二进制编码,保留最低8位
10             bin_rep = format(num, '#010b')[-8:]
11             # 这是一个新的UTF-8编码的第一个字节
12             if n_bytes == 0:
13 
14                 # 计算前导1的个数
15                 for bit in bin_rep:
16                     if bit == '0': break
17                     n_bytes += 1
18 
19                 # 没有前导1,则表示是一个单子节的UTF-8编码
20                 if n_bytes == 0:#单子节只需要第一位是0即可
21                     continue
22 
23                 # 如果前导1,只有1位,或者超过4位,都是非法格式
24                 if n_bytes == 1 or n_bytes > 4:
25                     return False
26             else:
27                 # 这是某个UTF-8编码的非第一子节的表示
28                 # 必须是 `10xxxxxx` 的格式,即第0位必须是1,第1位必须是0
29                 if not (bin_rep[0] == '1' and bin_rep[1] == '0'):
30                     return False
31 
32             # 当前UTF-8编码内容,已经完成了1个字节的判断,长度-1
33             n_bytes -= 1
34 
35         # 数组中所有内容都验证是合法的,没有未验证的字节了。
36         return n_bytes == 0

算法思路:字符串判断。

参考:https://leetcode-cn.com/problems/utf-8-validation/solution/utf-8-bian-ma-yan-zheng-by-leetcode/

已将参考链接里的英文注释,按照我自己的理解,翻译成中文。

posted on 2020-04-09 10:42  Sempron2800+  阅读(197)  评论(0编辑  收藏  举报