1. 程式人生 > 其它 >LeetCode-393 UTF-8編碼驗證

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;
    }
};

 

執行結果