题目:
思路:
规律很明显,比较简单。
代码实现:
自己实现的代码,有点繁琐:
class Solution {
public:
int type(int i){
int mask = 128;
while (mask & i){
mask >>= 1;
}
if (mask == 128){
return 0;
}else if (mask == 32){
return 1;
}else if (mask == 16){
return 2;
}else if (mask == 8){
return 3;
}
return -1;
}
int beginOf10(int i){
return (i&128) && !(i&64);
}
bool validUtf8(vector<int>& data) {
int i = 0;
while (i < data.size()){
int t = type(data[i]);
if (t == -1){
return false;
}
++i;
while (t && i < data.size()){
if (!beginOf10(data[i])){
return false;
}
--t;
++i;
}
if (t > 0){
return false;
}
}
return true;
}
};
学习别人的代码:
class Solution {
public:
int type(int i){ // 判断第一个字节的第一个0所在的位置,以此来判断UTF8的长度
int mask = 128;
while (mask & i) mask >>= 1;
if (mask == 128) return 0;
else if (mask == 32) return 1;
else if (mask == 16) return 2;
else if (mask == 8) return 3;
return -1;
}
int beginOf10(int i){ // 判断此字节是否是以10开头
return (i&128) && !(i&64);
}
bool validUtf8(vector<int>& data) {
int cnt = 0;
for (int i = 0; i < data.size(); ++i){ // 逐个字节进行判断
if (cnt == 0){
int t = type(data[i]);
if (t == -1) return false; // 此字符不合法,不符合任何UTF-8的类型
cnt = t;
}else if (beginOf10(data[i])) // 判断此字节是否是以10开头
--cnt;
else
return false; // 如果上面beginOf10(data[i])判断失败,则走这里
}
return cnt == 0;
}
};
参考:
https://leetcode.com/problems/utf-8-validation/discuss/87462/Concise-C%2B%2B-implementation