LeetCode-393 UTF-8編碼驗證
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/utf-8-validation
題目描述
給定一個表示資料的整數陣列 data ,返回它是否為有效的 UTF-8 編碼。
UTF-8 中的一個字元可能的長度為 1 到 4 位元組,遵循以下的規則:
對於 1 位元組 的字元,位元組的第一位設為 0 ,後面 7 位為這個符號的 unicode 碼。
對於 n 位元組 的字元 (n > 1),第一個位元組的前 n 位都設為1,第 n+1 位設為 0 ,後面位元組的前兩位一律設為 10 。剩下的沒有提及的二進位制位,全部為這個符號的 unicode 碼。
這是 UTF-8 編碼的工作方式:
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
注意:輸入是整數陣列。只有每個整數的 最低 8 個有效位 用來儲存資料。這意味著每個整數只表示 1 位元組的資料。
示例 1:
輸入:data = [197,130,1]
輸出:true
解釋:資料表示位元組序列:11000101 10000010 00000001。
這是有效的 utf-8 編碼,為一個 2 位元組字元,跟著一個 1 位元組字元。
示例 2:
輸入:data = [235,140,4]
輸出:false
解釋:資料表示 8 位的序列: 11101011 10001100 00000100.
前 3 位都是 1 ,第 4 位為 0 表示它是一個 3 位元組字元。
下一個位元組是開頭為 10 的延續位元組,這是正確的。
但第二個延續位元組不以 10 開頭,所以是不符合規則的。
提示:
1 <= data.length <= 2 * 104
0 <= data[i] <= 255
解題思路
主要考察閱讀理解。
通過讀題得出不是UTF-8的情況有以下幾種
1、大於4位元組
2、首位元組10開頭
3、首位元組1個數與非首位元組10個數不匹配
簡單模擬就好了。
原始碼展示
class Solution { public: bool validUtf8(vector<int>& data) { for(int i = 0; i < data.size(); i++) { if(128 <=data[i] && data[i]< 192) return false; int bFlag = 128; int iCount = -1; while(bFlag & data[i]) { iCount++; bFlag = bFlag >> 1; } if(iCount > 3) return false; for(int j = 0; j < iCount; j++) { i++; if(i >= data.size() || data[i] < 128 || data[i] >= 192) { return false; } } } return true; } };
執行結果