leetcode 力扣 393 UTF-8 编码验证 题解 算法题
题目:UTF-8编码验证
给定一个表示数据的整数数组data,返回它是否为有效的UTF-8编码。UTF-8中的一个字符可能的长度为1到4字节,遵循以下的规则:
1.对于1字节的字符,字节的第一位设为0,后面7位为这个符号的unicode
码。
2.对于n字节的字符(n>1,第一个字节的前n位都设为1,第n+1位设为0,
后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。这是UTF-8编码的工作方式:
Char.numberrange|UTF-8octetsequence(hexadecimal|(binary
--------------------+---------------------------------------------00000000-0000007F|0xxxxxxx
00000080-000007FF|110xxxxx10xxxxxx
00000800-0000FFFF|1110xxxx10xxxxxx10xxxxxx
00010000-0010FFFF|11110xxx10xxxxxx10xxxxxx10xxxxxx
注意:输入是整数数组。只有每个整数的最低8个有效位用来存储数据。这意味着每个整数只表示1字节的数据。示例1:
输入:data=[197,130,1]输出:true
解释:数据表示字节序列:110001011000001000000001。
这是有效的utf-8编码,为一个2字节字符,跟着一个1字节字符。
示例2:
输入:data=[235,140,4]输出:false
解释:数据表示8位的序列:111010111000110000000100.前3位都是1,第4位为0表示它是一个3字节字符。下一个字节是开头为10的延续字节,这是正确的。
但第二个延续字节不以10开头,所以是不符合规则的。
提示:
••1<=data.length<=2*1040<=data[i]<=255
语言:Java
classSolution{
publicbooleanvalidUtf8(int[]data{
//NumberofbytesinthecurrentUTF-8characterintnumberOfBytesToProcess=0;
//Foreachintegerinthedataarray.for(inti=0;ilength;i++{
//Getthebinaryrepresentation.Weonlyneedtheleastsignificant8bits//foranygivennumber.
StringbinRep=Integer.toBinaryString(data[i];binRep=
binRep.length(>=8
?binRep.substring(binRep.length(-8
:"00000000".substring(binRep.length(%8+binRep;
//IfthisisthecasethenwearetostartprocessinganewUTF-8character.if(numberOfBytesToProcess==0{
//Getthenumberof1sinthebeginningofthestring.for(intj=