(G) UTF-8 Validation
UTF-8有几位空字符,就可以用空字符表示多大的range。
解决这个问题的关键在先设立Mask码,128,192,224,240.知道后面跟了几个byte的有效字符。
count==0, 先读mask,知道count
else, count--
循环步骤1,2
注意点,
在mask判断时,判断110XXXXX一定要与11100000判断是否等于11000000. 其中&的运算优先级低,需要加括号。严格判断后面有效字符是否以“10”开始。 因为是完全判断,所以之间顺序无所谓。
最后需要判断count==0, 不可直接返回true,否则[237] (11101101), 后面没有3个byte,返回了true。
public class Solution {
public boolean validUtf8(int[] data) {
int count = 0;
for(int i=0;i<data.length;i++){
if(count==0){
if((data[i]&128)==0) count = 0;
else if((data[i]&224)==192) count = 1;
else if((data[i]&240)==224) count = 2;
else if((data[i]&248)==240) count = 3;
else return false;
}
else{
if((data[i]&192)==128)
count--;
else return false;
}
}
return count==0;
}
}
类似LC三九三,但不是utf8,他给了我一张纸,介绍如何定义他说的编码方式,然后验证给定binary array是不是个合法的编码。Follow up是utf16转换这种编码。虽然一开始理解新的编码方式稍微有点慢,不过最后都写完了,这轮也没什么问题。