393-UTF-8 Validation
Description
A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules:
- For 1-byte character, the first bit is a 0, followed by its unicode code.
- For n-bytes character, the first n-bits are all one’s, the n+1 bit is 0, followed by n-1 bytes with most significant 2 bits being 10.
This is how the UTF-8 encoding would work:
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
Given an array of integers representing the data, return whether it is a valid utf-8 encoding.
Note:
The input is an array of integers. Only the least significant 8 bits of each integer is used to store the data. This means each integer represents only 1 byte of data.
Example 1:
data = [197, 130, 1], which represents the octet sequence: 11000101 10000010 00000001.
Return true.
It is a valid utf-8 encoding for a 2-bytes character followed by a 1-byte character.
Example 2:
data = [235, 140, 4], which represented the octet sequence: 11101011 10001100 00000100.
Return false.
The first 3 bits are all one's and the 4th bit is 0 means it is a 3-bytes character.
The next byte is a continuation byte which starts with 10 and that's correct.
But the second continuation byte does not start with 10, so it is invalid.
問題描述
UTF編碼下的字元可以由1到4個位元組組成, 遵守如下規則:
- 一個位元組長度的字元, 第一位為0, 接下來的位為unicode編碼
- n個位元組長度的字元, 開始的n位都是1, 第n + 1位為0, 接下來的n - 1個位元組的最高的兩位為10
給定一個陣列代表資料, 返回資料是否為有效的UTF8編碼。
問題分析
迭代data, 遍歷每個整數的時候, 首先算出該字元的位元組個數, 然後看看這一個字元對應的這些位是否滿足情況即可。
需要注意一些位運算的技巧
解法
class Solution {
public boolean validUtf8(int[] data) {
if(data == null || data.length == 0) return false;
boolean isValid = true;
for(int i = 0;i < data.length;i++){
if(data[i] > 255) return false; // 1 after 8th digit, 100000000
int numberOfBytes = 0;
if((data[i] & 128) == 0){ // 0xxxxxxx, 1 byte, 128(10000000)
numberOfBytes = 1;
}else if((data[i] & 224) == 192){ // 110xxxxx, 2 bytes, 224(11100000), 192(11000000)
numberOfBytes = 2;
}else if((data[i] & 240) == 224){ // 1110xxxx, 3 bytes, 240(11110000), 224(11100000)
numberOfBytes = 3;
}else if((data[i] & 248) == 240){ // 11110xxx, 4 bytes, 248(11111000), 240(11110000)
numberOfBytes = 4;
}else{
//一個字元只由1到4個位元組組成
return false;
}
//判斷該字元的位元組是否滿足規則
for(int j = 1;j < numberOfBytes;j++){ // check that the next n bytes start with 10xxxxxx
if(i + j >= data.length) return false;
if((data[i + j] & 192) != 128) return false; // 192(11000000), 128(10000000)
}
//注意這裡
i = i + numberOfBytes - 1;
}
return isValid;
}
}
相關文章
- Laravel model validationLaravel
- Java Bean ValidationJavaBean
- [Vue] Props: Custom ValidationVue
- Spring Validation 的使用Spring
- dubbo~javax.validation和jakarta.validation的介紹與排雷Java
- jquery-validation的使用jQuery
- 關於Validation的方法使用
- 理解「交叉驗證」(Cross Validation)ROS
- Spring Validation實現原理分析Spring
- Machine Learning(14) - K Fold Cross ValidationMacROS
- leetcode393. UTF-8 ValidationLeetCode
- Laravel 學習筆記之 request validationLaravel筆記
- 使用spring validation 作為資料校驗Spring
- 使用jakarta.validation自定義校驗規則
- Java-Bean Validation後端校驗總結JavaBean後端
- 使用Spring Validation優雅地校驗引數Spring
- validation客戶端驗證框架使用手冊客戶端框架
- Spring Boot之Validation自定義實現總結Spring Boot
- Laravel 的 Validation 檢索驗證錯誤訊息Laravel
- SpringBoot Validation優雅的全域性引數校驗Spring Boot
- Java SpringBoot上的引數校驗JSR 303 ValidationJavaSpring BootJS
- Restful ABAP Programming模型系列二:Action和Validation的實現REST模型
- [Abp vNext 入坑分享] - 7.Automapper與validation的使用APP
- HV000030: No validator could be found for constraint ‘javax.validation.constraints.Pattern‘ validatiAIJava
- Spring Validation-用註解代替程式碼引數校驗Spring
- 理解ASP.NET Core - 模型繫結&驗證(Model Binding and Validation)ASP.NET模型
- Spring-Validation(後端資料校驗) 你值得擁有Spring後端
- Spring Boot 之groups應對不同的Validation規則自定義Spring Boot
- 【Mongo】MongoDB乾貨系列-Variety與Document Validation規範欄位MongoDB
- .net core中Grpc使用報錯:The remote certificate is invalid according to the validation procedure.RPCREM
- 一個沒有技術含量的 validation 驗證層輪子
- WebGeeker-Validation: 一個強大的 PHP 引數驗證器WebPHP
- javax.validation包校驗巢狀屬性(List物件)的寫法Java巢狀物件
- Lumen 表單校驗配置 validation 的中文 (多語言) 錯誤語
- 【模型評估與選擇】交叉驗證Cross-validation: evaluating estimator performance模型ROSORM
- 尋找寫程式碼感覺(十六)之 整合Validation做引數校驗
- 使用 Message Manager 實現開箱即用的驗證(Validation)資訊丟擲
- spring-boot 使用hibernate validation對引數進行優雅的校驗Springboot