题目:

给定一个表示数据的整数数组 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 开头,所以是不符合规则的。

提示:

  • 1 <= data.length <= 2 * 104
  • 0 <= data[i] <= 255

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

解题思路:

根据题目的意思可以得知,UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则:

  • 如果是只有1个字节,只能以 0 开头,形如 0xxxxxxx;
  • 如果由2个字节组成,首字节只能以 110 开头,形如 110xxxxx;
  • 如果由3个字节组成,首字节只能以 1110 开头,形如 1110xxxx;
  • 如果由4个字节组成,首字节只能以 11110 开头,形如 11110xxx;
  • 后续跟着的字节只能以 10 开头,形如 10xxxxxx。

1.首先从前往后统计每个data[i]中从前往后有多少个连续的1,记为count;

2.如果count== 1 或者 count > 4,与题目要求的条件【连续1的个数在2~4之间】,【字符长度在1~4之间】不符,直接返回false;

3.如果 i 后面不足count -1 个也要返回false(用自己的话说就是,一共应该有count个,当前 i 占一个,后面如果不足count - 1就不满足条件);

4.否则,检查 [i+1, i+count -1] 范围中的字节是否满足10xxxxxx, 不满足就返回false;

5.如果以上都满足条件的话就进入下一个数,进行以上的操作。最终都没有问题就符合题中对UTF-8 的定义,返回true。

代码:

 1 class Solution {
2 public boolean validUtf8(int[] data) {
3 int n = data.length;
4 for(int i = 0; i < n; ){
5 int num = data[i], j = 7;
6 while((((num >> j) & 1) == 1) && j >= 0){
7 j--;
8 }
9 //统计1的个数
10 int count = 7 - j;
11 //超出规范字节数
12 if(count == 1 || count > 4) return false;
13 //越界
14 if(i + count - 1 >= n) return false;
15 //判断后面的二进制数是否满足以10开头
16 for(int m = i + 1; m < i + count; m++){
17 if((((data[m] >> 7) & 1) != 1) || (((data[m] >> 6) & 1) != 0)){
18 return false;
19 }
20 }
21 //进入下一个检查点
22 if(count == 0) i++;
23 else i += count;
24 }
25 return true;
26 }
27 }

力扣393(java)-UTF-8编码验证(中等)的更多相关文章

  1. 力扣—gray code (格雷编码) python实现

    题目描述: 中文: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 英文: Th ...

  2. 393 UTF-8 Validation UTF-8 编码验证

    详见:https://leetcode.com/problems/utf-8-validation/description/ C++: class Solution { public: bool va ...

  3. 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念

    转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...

  4. 力扣算法经典第一题——两数之和(Java两种方式实现)

    一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...

  5. java String.getBytes()编码问题——String.getBytes(charset)

    String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ...

  6. Delphi和JAVA用UTF-8编码进行Socket通信例子

    最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...

  7. 【Java】身份证号码验证

    代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...

  8. Java中的数据验证

    原文链接:https://www.cuba-platform.com/blog/2018-10-09/945 翻译:CUBA China CUBA-Platform 官网 : https://www. ...

  9. Java实现身份证号码验证源码分享

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  10. 力扣561. 数组拆分 I-C语言实现-简单题

    题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...

随机推荐

  1. day07-Java方法01

    Java方法01 1.什么是方法? Java是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包含于类或者对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:方法 ...

  2. drf(JWT认证)

    一. jwt实现过程 1. 构建jwt过程 第一: 用户提交用户名和密码给服务端,如果登录成功,使用jwt创建一个token,并给用户返回 eyJ0eXAiOiJqd3QiLCJhbGciOiJIUz ...

  3. 三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析

    三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析 随着三维模型在各个领域的广泛应用,对于其格式的轻量化压缩处理和效率提高的需求也越发迫切.本文将介绍一些技术方法,帮助实现三维模型3DTile ...

  4. ItemsControl和ListView、ListBox的区别

    1.ItemsControl用来显示一个数据项的集合,它的底层是一个列表,它可以非常灵活的展示布局和数据 以下是例子 <ItemsControl ItemsSource="{Bindi ...

  5. C++ Concurrency in Action 读书笔记二:用mutex互斥锁保护在线程间共享的数据

    Chapter 3 线程间共享数据 3.2 用互斥锁保护共享数据

  6. elementui中下拉框(select)抖动问题

    将下面样式加入即可 // 处理下拉框中抖动 .el-select .el-input__inner { vertical-align: bottom !important; } 如设置了size属性, ...

  7. JAVA 获取文件 MD5

    private static final char[] hexCode = "0123456789ABCDEF".toCharArray(); // 文件类取MD5 public ...

  8. 英语文档阅读之Zynq-7000 All Programmable SoC

    Read "Zynq-7000 All programmable Soc" 1.Table of Contents 首先是目录,可以看到是标准的总分结构.开头介绍了Zynq的各种功 ...

  9. 可变形卷积系列(一) 打破常规,MSRA提出DCNv1 | ICCV 2017 Oral

    论文提出可变形卷积帮助模型高效地学习几何变换能力,能够简单地应用到分类模型和检测模型中,思想新颖,效果显著,十分值得学习   来源:晓飞的算法工程笔记 公众号 论文: Deformable Convo ...

  10. FineReport 自定义工具栏样式

    虽然FR界面的工具栏已经很商业化,很好看了,但是总会有那么些需求希望你可以修改工具栏的样式. 修改工具栏样式的主要思路是: 通过JQ选择器选中需要调整的元素,然后修改他们的样式 接下来,我们尝试着对工 ...