LeetCode #393 - UTF-8 Validation

本文介绍了一种用于验证UTF-8编码有效性的算法。通过分析输入整数数组,算法检查每个字节是否符合UTF-8编码规则,包括1到4字节长的字符编码规范。文章详细解释了如何通过位操作来判断数据是否正确编码。

题目描述:

A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules:

1. For 1-byte character, the first bit is a 0, followed by its unicode code.

2. For n-bytes character, the first n-bits are all one's, the n+1 bit is 0, followed by n-1 bytes with most significant 2 bits being 10.

This is how the UTF-8 encoding would work:

      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

Given an array of integers representing the data, return whether it is a valid utf-8 encoding.

Note:
The input is an array of integers. Only the least significant 8 bits of each integer is used to store the data. This means each integer represents only 1 byte of data.

Example 1:

data = [197, 130, 1], which represents the octet sequence: 11000101 10000010 00000001.

Return true.

It is a valid utf-8 encoding for a 2-bytes character followed by a 1-byte character.

Example 2:

data = [235, 140, 4], which represented the octet sequence: 11101011 10001100 00000100.

Return false.

The first 3 bits are all one's and the 4th bit is 0 means it is a 3-bytes character.

The next byte is a continuation byte which starts with 10 and that's correct.

But the second continuation byte does not start with 10, so it is invalid.

//对于UTF-8编码中的任意字节B,如果B的第一位为0,则B独立的表示一个字符(ASCII码);

//如果B的第一位为1,第二位为0,则B为一个多字节字符中的一个字节(非ASCII字符);

//如果B的前两位为1,第三位为0,则B为两个字节表示的字符中的第一个字节;

//如果B的前三位为1,第四位为0,则B为三个字节表示的字符中的第一个字节;

//如果B的前四位为1,第五位为0,则B为四个字节表示的字符中的第一个字节;

class Solution {
public:
    bool validUtf8(vector<int>& data) {
        int i=0;
        while(i<data.size())
        {
            int x=0b10000000;
            if((data[i]&x)==0) 
            {
                i++;
                continue;
            }
            int count=0;
            while((data[i]&x)>0)//位操作优先级低,必须加上括号
            {
                count++;
                x=x>>1;
            }
            if(count==1||count>4)  return false;
            for(int j=i+1;j<i+count;j++) //判断指示字节之后的(count-1)个字节是否以10开头
                if((data[j]&0b10000000)==0||(data[j]&0b01000000)!=0) return false;
            i+=count;//count包含了开头的第一个指示字节
        }
        return true;
    }
};

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值