LeetCode:393. UTF-8 Validation - Python

问题描述:

393. UTF-8 编码验证

UTF-8 中的一个字符可能的长度为14 字节,遵循以下的规则:

对于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 007F0xxxxxxx
0000 0080-0000 07FF110xxxxx 10xxxxxx
0000 0800-0000 FFFF1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF11110xxx 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))

声明: 总结学习,有问题可以批评指正,大神可以略过哦。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值