393. UTF-8 编码验证 https://leetcode-cn.com/problems/utf-8-validation/
按照要求验证即可,这里将每种字节验证当做一个原子操作,要不完成,要不失败!
代码容易,但是功能清晰。
class Solution {
public:
bool validUtf8(vector<int>& data) {
int n=data.size();
int i=0;
if(n==0) return true;
while(i<n)
{
int t=data[i]%256;
if(t>=0&&t<=127) //1字节验证
{
i++;
}else if(t>=129&&t<=223) //2字节验证
{
i++; if(i==n) return false;
t=data[i]%256;
if(t>=128&&t<=191) {i++;}
else return false;
}
else if(t>=224&&t<=239)//3字节验证
{
i++; if(i==n) return false;
t=data[i]%256;
if(t>=128&&t<=191)
{
i++; if(i==n) return false;
t=data[i]%256;
}
else return false;
if(t>=128&&t<=191)
{
i++;
}
else return false;
}
else if(t>=240&&t<=247) //4字节验证
{
i++; if(i==n) return false;
t=data[i]%256;
if(t>=128&&t<=191)
{
i++;
if(i==n) return false;
t=data[i]%256;
}
else return false;
if(t>=128&&t<=191)
{
i++; if(i==n) return false;
t=data[i]%256;
}
else return false;
if(t>=128&&t<=191)
{i++;}
else return false;
}else
return false; //非法字节验证
}
return true;
}
};
简介代码
class Solution {
public:
bool validUtf8(vector<int>& data) {
int n=data.size();
int i=0;
if(n==0) return true;
int leftbyte=0;
while(i<n)
{
int t=data[i]%256;
i++;
if(leftbyte>0)
{
if(t>=128&&t<=191) {leftbyte--;continue;}
else return false;
}
if(t>=0&&t<=127) //1字节验证
{
leftbyte=0;
}else if(t>=129&&t<=223) //2字节验证
{
leftbyte=1;
}
else if(t>=224&&t<=239)//3字节验证
{
leftbyte=2;
}
else if(t>=240&&t<=247) //4字节验证
{
leftbyte=3;
}else
return false; //非法字节验证
}
if(!leftbyte) return true;
else return false;
}
};