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

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

今天和大家聊的问题叫做 UTF-8 编码验证,我们先来看题面:https://leetcode-cn.com/problems/utf-8-validation/

26.jpg

27.jpg

示例

示例 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


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

相关文章
|
4月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
5月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
133 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
57 1
|
4月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
3月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
18 0
|
5月前
|
算法 Python
【Leetcode刷题Python】 LeetCode 2038. 如果相邻两个颜色均相同则删除当前颜色
本文介绍了LeetCode 2038题的解法,题目要求在一个由'A'和'B'组成的字符串中,按照特定规则轮流删除颜色片段,判断Alice是否能够获胜,并提供了Python的实现代码。
60 3
|
5月前
|
Python
【Leetcode刷题Python】50. Pow(x, n)
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
35 1
|
5月前
|
Python
【Leetcode刷题Python】LeetCode 478. 在圆内随机生成点
本文介绍了LeetCode 478题的解法,题目要求在给定圆的半径和圆心位置的情况下实现在圆内均匀随机生成点的功能,并提供了Python的实现代码。
39 1
|
5月前
|
算法 Python
【Leetcode刷题Python】73. 矩阵置零
本文介绍了LeetCode第73题的解法,题目要求在给定矩阵中将所有值为0的元素所在的行和列全部置为0,并提供了一种原地算法的Python实现。
43 0
【Leetcode刷题Python】73. 矩阵置零
|
5月前
|
Python
【Leetcode刷题Python】1467. 两个盒子中球的颜色数相同的概率
本文介绍了LeetCode第50题"Pow(x, n)"的解法,题目要求实现计算x的n次幂的函数,文章提供了递归分治法的详细解析和Python实现代码。
61 0