ให้อาร์เรย์จำนวนเต็มแทนไบต์ข้อมูล ตรวจสอบว่าเป็น UTF-8 ที่ถูกต้องหรือไม่ กฎ UTF-8:
- 1 ไบต์: เริ่มด้วย
0 - n ไบต์: เริ่มด้วย
nตัว 1 แล้วตามด้วย0ต่อมาn-1ไบต์ ต้องเริ่มด้วย10
ตัวอย่าง: [197,130,1] → true (11000101 10000010 00000001 = 2-byte char + 1-byte char)
ขั้นตอนการแก้ปัญหา
cnt = 0(จำนวนไบต์ต่อเนื่องที่คาดหวัง)- วนแต่ละไบต์
x:- ถ้า
cnt == 0(เริ่มตัวอักษรใหม่):(x >> 5) == 0b110→cnt = 1(x >> 4) == 0b1110→cnt = 2(x >> 3) == 0b11110→cnt = 3(x >> 7) != 0→ invalid (ไม่ใช่ 1-byte และไม่ match pattern)
- มิฉะนั้น (อยู่ในไบต์ต่อเนื่อง): ต้องมี
(x >> 6) == 0b10มิฉะนั้น invalid,cnt--
- ถ้า
- สิ้นสุด คืน
cnt == 0
ตัวอย่างโค้ด C++
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
bool validUtf8(vector<int>& data) {
int cnt = 0;
for (int x : data) {
if (!cnt) {
if ((x >> 5) == 0b110) cnt = 1;
else if ((x >> 4) == 0b1110) cnt = 2;
else if ((x >> 3) == 0b11110) cnt = 3;
else if ((x >> 7) != 0) return false;
} else {
if ((x >> 6) != 0b10) return false;
cnt--;
}
}
return cnt == 0;
}
};
int main() {
Solution ob;
vector<int> v = {197,130,1};
cout << ob.validUtf8(v);
}
Input
[197,130,1]
Output
1