力扣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 ...
随机推荐
- win10 有 休眠 功能,将内存保存到文件,开机10秒左右,恢复之前idea等所有软件
休眠 休眠 休眠 重要的事情说三遍. 提示,默认不显示,需要控制面板 电源里面设置下.
- python getOpenFileNames 获取文件实例解析
一 概念 选取文件夹 QFileDialog.getExistingDirectory() 选择文件 QFileDialog.getOpenFileName() 选择多个文件 QFileDialog. ...
- 从一线方案商的角度来看高通QCC3020芯片
写在前面的话 QCC3020的推出已经有一段时间了.在蓝牙音频的圈子里,属于家喻户晓的芯片了.再加上高通的大力宣传和一些顶尖级产品的使用,可以说,它是高通在吸收CSR的技术之后,着力推出的最具竞争 ...
- Java基础知识篇04——数组
哈喽,大家好!我是白夜,今天给大家聊聊数组. 一.概念 计算机在内存区域分配的一段连续的区域(空间),用来存储同种类型的多个数据 简单的理解,数组就是一堆盒子,同一时间,可以保存多个相同数据类型的数据 ...
- 计算机网络(http协议)
一 软件开发架构 CS 客户端 服务端BS 浏览器 服务端ps: BS本质也是CS 二 浏览器窗口输入网址回车发生了几件事 1.浏览器朝服务端发送请求2.服务端接受请求3.服务端返回相应的响应4. ...
- 2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣。 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组。 每组中的物品只能选择1件,现在他想
2024-03-20:用go语言,自 01背包问世之后,小 A 对此深感兴趣. 一天,小 A 去远游,却发现他的背包不同于 01 背包,他的物品大致可分为 k 组. 每组中的物品只能选择1件,现在他想 ...
- 基于QGIS生产建筑物高度与遥感影像数据集
1. 概述 利用遥感影像推知建筑物高度是一经典研究,现有很多学者利用机器学习的方式,利用现有数据进行训练从而构建模型 本文旨在记述使用QGIS进行建筑物高度与遥感影像数据集的获取与制作 如果不想自己动 ...
- TP6框架--EasyAdmin学习笔记:excel的数据,图片处理
这是我写的学习EasyAdmin的第七章,这一章我给大家分享下如何处理excel中的数据,图片 原理就是使用easyadmin中封装好的phpexcel,来进行数据的导入,view层我们需要一个用了导 ...
- Ubuntu系统部署springcloud+nacos遇到的问题。
1,部署上的jar包运行正常,但是通过浏览器不能访问,telnet +IP+端口连接不通.小皮面板访问后台接口也是不通但是小皮面板可以通过浏览器访问.具体问题暂未解决. 2,改用docker部署,将j ...
- KingbaseES Json 系列三:Json数据操作函数一
KingbaseES Json 系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSO ...