问题描述:
UTF-8
中的一个字符可能的长度为1
到 4
字节,遵循以下的规则:
对于1
字节的字符,字节的第一位设为 0
,后面 7
位为这个符号的unicode
码。
对于n
字节的字符 (n > 1)
,第一个字节的前 n
位都设为 1
,第 n+1
位设为 0
,后面字节的前两位一律设为 10
。剩下的没有提及的二进制位,全部为这个符号的 unicode
码。
这是 UTF-8
编码的工作方式:
Char. number range (hexadecimal) UTF-8 octet sequence(binary) 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
给定一个表示数据的整数数组,返回它是否为有效的 utf-8
编码。
注意:
输入是整数数组。只有每个整数的最低8
个有效位用来存储数据。这意味着每个整数只表示 1
字节的数据。
示例 1:
data = [197, 130, 1], 表示 8 位的序列: 11000101 10000010 00000001.
返回 true 。
这是有效的 utf-8 编码,为一个2字节字符,跟着一个1字节字符。
问题分析:
感觉题目难的不是解决方法,而是理解题目哈,很绕口感觉,题目的意思就是,把给的数字转换成2进制
表示,然后判断这个2进制
是否,·是合法的utf-8
编码。其中utf-8
编码的规则上面已经给出。具体解决方法,就是对这个数列遍历一遍,规则可以看做数字大小的范围,因此也不必转成2进制
形式就可以解决。
Python3实现:
class Solution:
def validUtf8(self, data):
cnt = 0 # 用于记录当前是几字节编码
for byte in data:
if 128 <= byte <= 191: # 表示这数字对应的2进制 为 10xxxxxx 类型的,所以不能作为开头
if cnt == 0: # 此时,如果 cnt==0 直接返回 False
return False
cnt -= 1 # 当前 位 合法,进入下一位比较
else: # -- -- 判断 当前 二进制 非10 开头的情况
if cnt:
return False
if byte < 128: # 表示一个字节的情况
continue
elif byte < 224: # 两个字节的情况
cnt = 1
elif byte < 240: # 三个字节的情况
cnt = 2
elif byte < 248: # 四个字节的情况
cnt = 3
else: # 其他情况均为 False
return False
return cnt == 0 # 比较结束, cnt 必须为0 才是合法的
if __name__ == '__main__':
solu = Solution()
data = [197, 130, 1]
data = [235, 140, 4]
print(solu.validUtf8(data))
声明: 总结学习,有问题可以批评指正,大神可以略过哦。