力扣393(java)-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 编码的工作方式:
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编码验证(中等)的更多相关文章
- 力扣—gray code (格雷编码) python实现
题目描述: 中文: 格雷编码是一个二进制数字系统,在该系统中,两个连续的数值仅有一个位数的差异. 给定一个代表编码总位数的非负整数 n,打印其格雷编码序列.格雷编码序列必须以 0 开头. 英文: Th ...
- 393 UTF-8 Validation UTF-8 编码验证
详见:https://leetcode.com/problems/utf-8-validation/description/ C++: class Solution { public: bool va ...
- 从Java String实例来理解ANSI、Unicode、BMP、UTF等编码概念
转(http://www.codeceo.com/article/java-string-ansi-unicode-bmp-utf.html#0-tsina-1-10971-397232819ff9a ...
- 力扣算法经典第一题——两数之和(Java两种方式实现)
一.题目 难度:简单 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数, 并返回它们的数组下标. 你可以假设每种输入只会对应一 ...
- java String.getBytes()编码问题——String.getBytes(charset)
String的getBytes()方法是得到一个字串的字节数组,这是众所周知的.但特别要注意的是,本方法将返回该操作系统默认的编码格式的字节数组.如果你在使用这个方法时不考虑到这一点,你会发现在一个平 ...
- Delphi和JAVA用UTF-8编码进行Socket通信例子
最近的项目(Delphi开发),需要经常和java语言开发的系统进行数据交互(Socket通信方式),数据编码约定采用UTF-8编码. 令我无语的是:JAVA系统那边反映说,Delphi发的数据他们收 ...
- 【Java】身份证号码验证
代码引用自:https://gitee.com/appleat/codes/ynrtqujv0wfgesm8ia9b547 package xxx; /** * Created by wdj on 2 ...
- Java中的数据验证
原文链接:https://www.cuba-platform.com/blog/2018-10-09/945 翻译:CUBA China CUBA-Platform 官网 : https://www. ...
- Java实现身份证号码验证源码分享
import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...
- 力扣561. 数组拆分 I-C语言实现-简单题
题目 传送门 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(a ...
随机推荐
- day07-Java方法01
Java方法01 1.什么是方法? Java是语句的集合,它们在一起执行一个功能 方法是解决一类问题的步骤的有序集合 方法包含于类或者对象中 方法在程序中被创建,在其他地方被引用 设计方法的原则:方法 ...
- drf(JWT认证)
一. jwt实现过程 1. 构建jwt过程 第一: 用户提交用户名和密码给服务端,如果登录成功,使用jwt创建一个token,并给用户返回 eyJ0eXAiOiJqd3QiLCJhbGciOiJIUz ...
- 三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析
三维模型3DTile格式轻量化压缩处理效率提高的技术方浅析 随着三维模型在各个领域的广泛应用,对于其格式的轻量化压缩处理和效率提高的需求也越发迫切.本文将介绍一些技术方法,帮助实现三维模型3DTile ...
- ItemsControl和ListView、ListBox的区别
1.ItemsControl用来显示一个数据项的集合,它的底层是一个列表,它可以非常灵活的展示布局和数据 以下是例子 <ItemsControl ItemsSource="{Bindi ...
- C++ Concurrency in Action 读书笔记二:用mutex互斥锁保护在线程间共享的数据
Chapter 3 线程间共享数据 3.2 用互斥锁保护共享数据
- elementui中下拉框(select)抖动问题
将下面样式加入即可 // 处理下拉框中抖动 .el-select .el-input__inner { vertical-align: bottom !important; } 如设置了size属性, ...
- JAVA 获取文件 MD5
private static final char[] hexCode = "0123456789ABCDEF".toCharArray(); // 文件类取MD5 public ...
- 英语文档阅读之Zynq-7000 All Programmable SoC
Read "Zynq-7000 All programmable Soc" 1.Table of Contents 首先是目录,可以看到是标准的总分结构.开头介绍了Zynq的各种功 ...
- 可变形卷积系列(一) 打破常规,MSRA提出DCNv1 | ICCV 2017 Oral
论文提出可变形卷积帮助模型高效地学习几何变换能力,能够简单地应用到分类模型和检测模型中,思想新颖,效果显著,十分值得学习 来源:晓飞的算法工程笔记 公众号 论文: Deformable Convo ...
- FineReport 自定义工具栏样式
虽然FR界面的工具栏已经很商业化,很好看了,但是总会有那么些需求希望你可以修改工具栏的样式. 修改工具栏样式的主要思路是: 通过JQ选择器选中需要调整的元素,然后修改他们的样式 接下来,我们尝试着对工 ...