LeetCode-393 UTF-8编码验证

简介: LeetCode-393 UTF-8编码验证

来源:力扣(LeetCode)

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

题目描述

给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码。

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

对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。

对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。

这是 UTF-8 编码的工作方式:

Char. number range | UTF-8 octet sequence

(hexadecimal) | (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

注意:输入是整数数组。只有每个整数的 最低 8 个有效位 用来存储数据。这意味着每个整数只表示 1 字节的数据。

 

示例 1:
输入:data = [197,130,1]
输出:true
解释:数据表示字节序列:11000101 10000010 00000001。
这是有效的 utf-8 编码,为一个 2 字节字符,跟着一个 1 字节字符。
示例 2:
输入:data = [235,140,4]
输出:false
解释:数据表示 8 位的序列: 11101011 10001100 00000100.
前 3 位都是 1 ,第 4 位为 0 表示它是一个 3 字节字符。
下一个字节是开头为 10 的延续字节,这是正确的。
但第二个延续字节不以 10 开头,所以是不符合规则的。
提示:
1 <= data.length <= 2 * 104
0 <= data[i] <= 255

解题思路

主要考察阅读理解。

通过读题得出不是UTF-8的情况有以下几种

1、大于4字节

2、首字节10开头

3、首字节1个数与非首字节10个数不匹配

简单模拟就好了。

源码展示

 

class Solution {
public:
    bool validUtf8(vector<int>& data) {
        for(int i = 0; i < data.size(); i++)
        {
            if(128 <=data[i] && data[i]< 192)
                return false;
            int bFlag = 128;
            int iCount = -1;
            while(bFlag & data[i])
            {
                iCount++;
                bFlag = bFlag >> 1;
            }
            if(iCount > 3) return false;
            for(int j = 0; j < iCount; j++)
            {
                i++;
                if(i >= data.size() || data[i] < 128 || data[i] >= 192)
                {
                    return false;
                }
            }
        }
        return true;
    }
};

运行结果

 

相关文章
|
1月前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
23 0
|
6月前
【Leetcode -680.验证回文串Ⅱ -693.交替位二进制数】
【Leetcode -680.验证回文串Ⅱ -693.交替位二进制数】
23 0
|
6月前
|
canal 算法
【Leetcode-121.买卖股票的最佳时机 -125.验证回文串】
【Leetcode-121.买卖股票的最佳时机 -125.验证回文串】
30 0
|
5月前
leetcode255. 验证前序遍历序列二叉搜索树
leetcode255. 验证前序遍历序列二叉搜索树
25 0
|
6月前
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
28 0
|
3月前
|
Go
golang力扣leetcode 98. 验证二叉搜索树
golang力扣leetcode 98. 验证二叉搜索树
15 0
|
3月前
|
测试技术
leetcode98验证二叉搜索树刷题打卡
leetcode98验证二叉搜索树刷题打卡
17 0
|
3月前
|
C++ Python
leetcode-98:验证二叉搜索树
leetcode-98:验证二叉搜索树
32 1
|
3月前
leetcode-125:验证回文串
leetcode-125:验证回文串
23 0
LeetCode刷题Day16——二叉搜索树(搜索、验证、最小绝对差、众数)
一、二叉搜索树中的搜索 题目链接:700. 二叉搜索树中的搜索