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;
    }
};

运行结果

 

相关文章
|
7月前
leetcode-89:格雷编码
leetcode-89:格雷编码
50 0
|
7月前
|
存储 canal 算法
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
[Java·算法·简单] LeetCode 125. 验证回文串 详细解读
58 0
【Leetcode -680.验证回文串Ⅱ -693.交替位二进制数】
【Leetcode -680.验证回文串Ⅱ -693.交替位二进制数】
41 0
|
canal 算法
【Leetcode-121.买卖股票的最佳时机 -125.验证回文串】
【Leetcode-121.买卖股票的最佳时机 -125.验证回文串】
49 0
leetcode255. 验证前序遍历序列二叉搜索树
leetcode255. 验证前序遍历序列二叉搜索树
46 0
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
代码随想录Day17 LeetCode T98 验证二叉搜索树 T530 二叉搜索树的最小绝对差 T501 二叉搜索树中的众数 T236二叉搜索树的最近公共祖先
57 0
|
2月前
【LeetCode 40】98.验证二叉搜索树
【LeetCode 40】98.验证二叉搜索树
15 0
|
4月前
|
Python
【Leetcode刷题Python】946. 验证栈序列
LeetCode题目“946. 验证栈序列”的Python解决方案,通过模拟栈的压入和弹出操作来验证给定的两个序列是否能通过合法的栈操作得到。
33 6
|
6月前
力扣经典150题第二十五题:验证回文串
力扣经典150题第二十五题:验证回文串
39 0
|
6月前
|
canal 算法 数据可视化
LeetCode 125题:验证回文串
LeetCode 125题:验证回文串