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

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 UTF-8 编码验证,我们先来看题面:
https://leetcode-cn.com/problems/utf-8-validation/

示例

示例 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:判断子序列
(0)

相关推荐

  • 女朋友问我:为什么会乱码?

    前言 乱码这个东西相信大家都遇到过,今天我的女朋友三歪就火急火燎的上来找我:"亲爱的,我的idea怎么输出乱码了?" 我一顿操作就给他搞好了,但是三歪不愧是我的女朋友,好奇心跟我是 ...

  • 2KB: 文档乱码怎么办? 字符编码,字符集的故事

    浏览网页的时候,有时候网页会是一堆乱码,或者下载文档的时候,会发现文件名是乱码. 乱码要么是文档损坏了,软件不能正确显示.这时候我们需要重新下载或者寻求难度高的恢复操作.而有时文档乱码仅仅是因为软件( ...

  • Leetcode面试系列 第1天:Leetcode 89 - 格雷码

    最近,打算花点时间写个 Python 解决 Leetcode 题的系列文章~ 大家是否还记得电影黑客帝国中的数字雨林的场景?事实上,计算机底层数据的存储和运算都是二进制的,因而面试题环节中面试官也经常 ...

  • Python编码方式有哪些?三大类!

    Python有哪几种编码方式?主要包含ASCII.GBK.Unicode与utf8几类,接下来我们一起来认识一下! ASCII表 众所周知,计算机起源于美国,英文只有26个字符,算上其他所有特殊符号也 ...

  • GB2312何时能够代替UTF-8?

    编码如果我们只认识UTF-8和GB2312就显得格局太小了,甚至于有非常多人不了解它们是什么,又代表了怎样的含义,所以才提出GB2312何时能够代替UTF-8的问题. 众所周知目前的机器仅能识别&qu ...

  • ​LeetCode刷题实战260:只出现一次的数字 III

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

  • ​LeetCode刷题实战258:各位相加

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

  • ​LeetCode刷题实战257:二叉树的所有路径

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

  • ​LeetCode刷题实战256:粉刷房子

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

  • ​LeetCode刷题实战262:行程和用户

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

  • ​LeetCode刷题实战255:验证前序遍历序列二叉搜索树

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

  • ​LeetCode刷题实战263:丑数

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

  • ​LeetCode刷题实战254:因子的组合

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

  • ​LeetCode刷题实战264:丑数 II

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