首页 > 编程语言 >#yyds干货盘点# LeetCode程序员面试金典:UTF-8 编码验证

#yyds干货盘点# LeetCode程序员面试金典:UTF-8 编码验证

时间:2024-01-10 23:32:02浏览次数:32  
标签:yyds return 字节 int 金典 num 10xxxxxx UTF

题目

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


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


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

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

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


     Number of Bytes  |        UTF-8 octet sequence

                      |              (binary)

  --------------------+---------------------------------------------

           1          | 0xxxxxxx

           2          | 110xxxxx 10xxxxxx

           3          | 1110xxxx 10xxxxxx 10xxxxxx

           4          | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

x 表示二进制形式的一位,可以是 0 或 1。


注意:输入是整数数组。只有每个整数的 最低 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 开头,所以是不符合规则的。

代码实现

class Solution {
    static final int MASK1 = 1 << 7;
    static final int MASK2 = (1 << 7) + (1 << 6);

    public boolean validUtf8(int[] data) {
        int m = data.length;
        int index = 0;
        while (index < m) {
            int num = data[index];
            int n = getBytes(num);
            if (n < 0 || index + n > m) {
                return false;
            }
            for (int i = 1; i < n; i++) {
                if (!isValid(data[index + i])) {
                    return false;
                }
            }
            index += n;
        }
        return true;
    }

    public int getBytes(int num) {
        if ((num & MASK1) == 0) {
            return 1;
        }
        int n = 0;
        int mask = MASK1;
        while ((num & mask) != 0) {
            n++;
            if (n > 4) {
                return -1;
            }
            mask >>= 1;
        }
        return n >= 2 ? n : -1;
    }

    public boolean isValid(int num) {
        return (num & MASK2) == MASK1;
    }
}


标签:yyds,return,字节,int,金典,num,10xxxxxx,UTF
From: https://blog.51cto.com/u_13321676/9187289

相关文章

  • # yyds干货盘点 # 盘点一个Python自动化办公的需求——一键批量插图到Excel指定单元格
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Python自动化办公的问题,问题如下:大佬们,昨天我在做插入excel图片的时候想起一个需求,好像挺难办的,也蛮现实的。比如每个图片是有名称的,但在做excel的时候,能不能按照excel中的名称调用图片插入。就像下面这样......
  • # yyds干货盘点 # 盘点一个AI都无法解决的Python基础题目(下篇)
    大家好,我是皮皮。一、前言前几天在Python白银交流群【大侠】问了一个Pandas实战的问题,一起来看看吧。上一篇文章说到,看上去AI给的答案,似乎让【大侠】不满意,遂来白银交流群问问大佬们。这一篇文章,我们一起来看看其他大佬给的代码。二、实现过程前面的文章中,我们看到了【瑜亮老师】和......
  • # yyds干货盘点 # 想要获取某某查上面网址这个数据获取怎么获取呀?超好用工具分享!
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个Python网络爬虫的问题。问题如下:大佬们想要获取某某查上面网址这个数据获取怎么获取呀为什么返回的源码就这一点 有没有什么比较好上手的工具啥的页面图:网络爬虫结果:二、实现过程这里【黑科技......
  • # yyds干货盘点 # 盘点一个AI都无法解决的Python基础题目(中篇)
    大家好,我是皮皮。一、前言前几天在Python白银交流群【大侠】问了一个Pandas实战的问题,一起来看看吧。上一篇文章说到,看上去AI给的答案,似乎让【大侠】不满意,遂来白银交流群问问大佬们。这一篇文章,我们一起来看看【瑜亮老师】给的代码。二、实现过程粉丝的原始数据中,还是有些乱的,比方......
  • #yyds干货盘点# LeetCode程序员面试金典:找不同
    题目给定两个字符串s和t,它们只包含小写字母。字符串t由字符串s随机重排,然后在随机位置添加一个字母。请找出在t中被添加的字母。 示例1:输入:s="abcd",t="abcde"输出:"e"解释:'e'是那个被添加的字母。示例2:输入:s="",t="y"输出:"y"代码实现classSo......
  • #yyds干货盘点# LeetCode程序员面试金典:复数乘法
    题目复数可以用字符串表示,遵循"实部+虚部i"的形式,并满足下述条件:实部是一个整数,取值范围是[-100,100]虚部也是一个整数,取值范围是[-100,100]i2==-1给你两个字符串表示的复数num1和num2,请你遵循复数表示形式,返回表示它们乘积的字符串。 示例1:输入:num1="1......
  • # yyds干货盘点 # 盘点一个工作中Python自动化处理实战问题(番外篇)
    大家好,我是皮皮。一、前言前几天在Python最强王者交流群【哎呦喂 是豆子~】问了一个工作中Python自动化处理实战问题,一起来看看吧。问题描述:数据在提供的数据表中,在表有编号、环节、审核人、金额、结束时间5列,对【编号、环节、审核人、金额】四条件进行分组,分组内结束时间升序排列......
  • # yyds干货盘点 # 盘点一个Pandas取值的问题(下篇)
    大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据提取的问题,上一篇文章我们介绍了基础篇,这一篇文章我们来延伸下,你想象下,我想要14和15行该怎么写?二、实现过程后来【论草莓如何成为冻干莓】给了一份代码,print(df.loc[[14,15],'作者':'回复'])。......
  • JDK9中的String底层实现为什么用UTF-16而不用UTF-8呢?
    UTF-8是一种对空间利用效率最高的编码集,它是不定长的,使用1~4字节为每个字符编码。这种情况下,如果能用一个字节存放字符就不会使用两个字节,两个字节不够就用三个字节。这种编码集只适用于传输和存储,并不适合拿来做String的底层实现。String有随机访问的方法,比如charAt、subString等......
  • #yyds干货盘点# LeetCode程序员面试金典:赎金信
    给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。如果可以,返回 true ;否则返回 false 。magazine 中的每个字符只能在 ransomNote 中使用一次。 示例1:输入:ransomNote="a",magazine="b"输出:false示例2:输入:ransomNot......