​LeetCode刷题实战393:UTF-8 编码验证

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 UTF-8 编码验证,我们先来看题面:

https://leetcode-cn.com/problems/utf-8-validation/

3ca612e34c096f3b94154042e569122a.png

18f7787743178bf7375b78fa391e5e9e.png

示例

示例 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 开头,所以是不符合规则的。

解题

首先需要读懂题目,分析题目可以知道我们模拟整个过程即可,首先我们判断当前位置的数字对应的二进制的第7位是否是1,如果为0那么continue即可,说明是一字节的字符不用管,如果为1的时候那么我们就需要计算当前的二进制数字从最高位连续的1的数目,如果k等于1或者大于4都是不满足条件的,因为utf-8编码最多是四个字节字符,当前对应的二进制数字从最高位连续的1的数目k大于1小于等于4的时候那么计算后面的k - 1个数字对应的二进制数字是否满足条件即可,也即判断后面k - 1个数字对应的二进制数字的第7位与第6位是否是10如果不是那么返回False,当满足条件的时候更新一下循环的变量判断后面的数字是否满足条件即可。

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

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。

上期推文:

LeetCode1-380题汇总,希望对你有点帮助!

LeetCode刷题实战381:O(1) 时间插入、删除和获取随机元素

LeetCode刷题实战382:链表随机节点

LeetCode刷题实战383:赎金信

LeetCode刷题实战384:打乱数组

LeetCode刷题实战385:迷你语法分析器

LeetCode刷题实战386:字典序排数

LeetCode刷题实战387:字符串中的第一个唯一字符

LeetCode刷题实战388:文件的最长绝对路径

LeetCode刷题实战389:找不同

LeetCode刷题实战390:消除游戏

LeetCode刷题实战391:完美矩形

LeetCode刷题实战392:判断子序列

774daef5f393762abf88263408b4aeff.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程IT圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值