关于utf-8编码,题目中已经有介绍。 第一位是0的字节,是单字节字符。 第一位是1,第二位是0的,不是。
前两位是1,第三位是0,接下来一字节前两位是10的是双字节字符。
前三位是1,第四位是0,接下来两字节前两位是10的是三字节字符。
前四位是1,第五位是0,接下来三字节前两位是10的是四字节字符。
其余不是。
知道了utf-8编码规则,就容易了。这道题的输入是一个int型的数组,每个数的后8位是有效的数据,表示一个字节。输出是bool型变量,表示输入的数据是否是有效的utf-8编码,注意两个合理的utf-8字符,也算有效的utf-8编码。
解法框架就是一个大循环,遍历每位数字,是utf-8字符的一部分就下一字符,不是就返回false,所有都有效,最后一个字符也完整,就返回true,思路清晰明了。
static int x = [] () {ios::sync_with_stdio(false); cin.tie(0); return 0;} ();
class Solution {
public:
bool validUtf8(vector<int>& data) {
int left = 0;
for (int i: data) {
if (left == 0) {
if ((i>>7) == 0) continue;
if ((i>>5) == 0b110) left = 1;
else if ((i>>4) == 0b1110) left = 2;
else if ((i>>3) == 0b11110) left = 3;
else return false;
} else {
if ((i>>6) != 0b10) return false;
--left;
}
}
return left == 0;
}
};