393.UTF-8 编码验证
模拟
模拟
主要思想就是根据字符的前置字节找到我们形成字符的位数,然后遍历后面字节是否合法即可完成。
class Solution {
public boolean validUtf8(int[] data) {
int loc = 0;
while(loc < data.length) {
// 找到字符的字节数
int c = 0;
for(int i = 7; i >= 0; i --) {
// 11000xxx 那么c就是2
if((data[loc] >> i & 1) == 1) c ++;
else break;
}
// 如果出现字符数不合规就要筛掉
if(c == 1 || c > 4) return false;
// 合规字符 但如果前置是11000xx 我们后面仅需要找到一个100xxxx的字节就ok了
if(c > 1) c -= 1;
// 遍历后续字节是否合规
for(int i = 1; i <= c; i ++) {
// 越界退出
if(loc + i >= data.length) return false;
// 判断是否以 10xxxxxx 开头
if((data[loc + i] >> 7 & 1) == 1 && (data[loc + i] >> 6 & 1) == 0)
continue;
else return false;
}
// 移动下标
loc += c + 1;
}
return true;
}
}