专栏首页Michael阿明学习之路LeetCode 393. UTF-8 编码验证(位运算)

LeetCode 393. UTF-8 编码验证(位运算)

1. 题目

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
给定一个表示数据的整数数组,返回它是否为有效的 utf-8 编码。

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

示例 1:
data = [197, 130, 1], 表示 8 位的序列: 11000101 10000010 00000001.
返回 true 。
这是有效的 utf-8 编码,为一个2字节字符,跟着一个1字节字符。

示例 2:
data = [235, 140, 4], 表示 8 位的序列: 11101011 10001100 00000100.
返回 false 。
前 3 位都是 1 ,第 4 位为 0 表示它是一个3字节字符。
下一个字节是开头为 10 的延续字节,这是正确的。
但第二个延续字节不以 10 开头,所以是不符合规则的。

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

2. 解题

  • 前面1的个数不能为1或者大于4
  • 为0的跳过,检查下一个
  • 为2-4,检查后面个数足不足,且都以10开头
class Solution {
public:
    bool validUtf8(vector<int>& data) {
    	int i = 0, j, one = 0, n = data.size();
    	while(i < n)
    	{
    		for(j = 7; j >= 0; --j)
    		{
    			if((data[i]&(1<<j)))//该位为1
    				one++;//1的个数
    			else
    				break;
    		}
    		if(one==1 || one > 4)
    			return false;
    		i++;
    		if(one == 0)
    			continue;//0个1,检查下一位
    		if(n-i < one-1) return false;//个数不够,不行
	    	for( ; i < n && (--one); ++i)//后面均以10开头
	    	{
	    		if(((data[i]>>7)&1)!=1 || ((data[i]>>6)&1)!=0)
	    			return false;
	    	}
    	}
    	return true;
    }
};

28 ms 13.4 MB

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • LeetCode 806. 写字符串需要的行数

    我们要把给定的字符串 S 从左到右写到每一行上,每一行的最大宽度为100个单位,如果我们在写某个字母的时候会使这行超过了100 个单位,那么我们应该把这个字母写...

    Michael阿明
  • LeetCode 989. 数组形式的整数加法

    对于非负整数 X 而言,X 的数组形式是每位数字按从左到右的顺序形成的数组。例如,如果 X = 1231,那么其数组形式为 [1,2,3,1]。

    Michael阿明
  • LeetCode 第 20 场双周赛(294 / 1541,前19.07%,第1次全部通过)

    全国排名:294/1541,前19.07%;全球排名:885/4347,前20.4%

    Michael阿明
  • Appium移动端自动化测试--元素操作与触摸动作

    1.click()点击操作 也可以用tab实现点击操作 driver.find_element_by_id("com.wuba.zhuanzhuan:id/ae...

    软测小生
  • Appium移动端自动化测试--元素操作与触摸动作【移动端自动化测试教程奉上】

    之前陆续介绍了移动端测试的相关知识,今天介绍下元素定位之后的操作与触摸动作,学习计划因为各种原因,搁置了很久,接下来继续之前的计划,APP和API接口测试。

    软测小生
  • 云安全之虚拟机安全监控

    自云计算诞生以来,虚拟机监控一直是一个炙手可热的话题。从云服务商的角度,他们要尽可能地获取更多的关于VM(Virtual Machine)运行状态的信息,从而保...

    凌洛云
  • 打破神话:容器vs虚拟机

    容器是当今IT界最热门的话题之一,很大程度上归功于许多网络公司如Facebook和Twitter的采用。 在过去的两年中,包括亚马逊网络服务(AWS)和谷歌计算...

    首席架构师智库
  • Java虚拟机常用的性能监控工具

    jps(JVM Process Status Tool)是JDK中的一个小工具,它的功能和UNIX的ps命令类似:可以列出正在运行的虚拟机进程,并显示虚拟机执行...

    小诸葛
  • Android虚拟机一年工作感受

    前段时间一度产生了换工作的想法,原因是自己在手机厂商做了一年的Android底层,却没有获取什么成就感,平日里面工作缺乏激情,希望往上层方向继续发展。也投了几份...

    congduan
  • 深入理解Java虚拟机-如何利用 JDK 自带的命令行工具监控上百万的高并发的虚拟机性能

    在前面的几篇文章已经讲解了利用一些可视化的工具进行 JVM 性能的监控,但是,在服务器上,我们很多时候是没有办法使用可视化的界面进行这种工作的,这种情景就相当于...

    好好学java

扫码关注云+社区

领取腾讯云代金券