力扣解法汇总393- UTF-8

原题链接:力扣


描述:

给定一个表示数据的整数数组 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


来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/utf-8-validation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

* 解题思路:
* 这题主要分两种情况吧,
* 第一种情况是num>0时,这时候代表前面是有积累的。则首位一定要为1,为1则num--。否则返回false。
* 第二种情况是num==0时,这种代表是UTF-8的首个字符,则要计算该字符多长,即num的数量。num=1或者num>4都是不合法的。而且要减去自身的那一个,所以num--。

代码:

public class Solution393 {

    public boolean validUtf8(int[] data) {
        int i = 0;
        int num = 0;
        while (i < data.length) {
            int value = data[i++];
            boolean b = (value & 0b1000_0000) == 0b1000_0000;
            if (num > 0) {
                if (b) {
                    num--;
                    continue;
                }
                return false;
            }
            if (num == 0) {
                int flag = 0b1000_0000;
                while ((value & flag) == flag) {
                    num++;
                    flag = flag >> 1;
                    if (num > 4) {
                        return false;
                    }
                }
                if (num == 1) {
                    return false;
                }
                num = num > 0 ? num - 1 : 0;
            }
        }
        return num == 0;
    }
}

猜你喜欢

转载自blog.csdn.net/AA5279AA/article/details/123486383