ここでのオリジナルタイトルリンク:https://leetcode.com/problems/utf-8-validation/
トピック:
UTF8の文字が長く、次の規則に供1〜4バイトであることができます。
- 1バイト文字の場合、最初のビットは、Unicodeコードに続いて、0です。
- 文字がnバイトの場合、第1のnビットがすべての人のであり、n + 1ビットが10である上位2ビットのn-1バイトに続いて、0です。
これは、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
データを表す整数の配列を指定し、それが有効なUTF-8符号化であるかどうかを返します。
注:
入力が整数の配列です。のみ各整数の最下位8ビットは、データを格納するために使用されます。これは、各整数データの1バイトのみを表すことを意味します。
例1:
11000101 10000010 00000001:オクテットシーケンス表すデータ= [197、130、1]、 真戻ります。 これは、1バイト文字に続く2バイト文字のための有効なUTF-8エンコーディングです。
例2:
11101011 10001100 00000100.:オクテットシーケンス表されるデータ= [235、140]、[4]、 リターン偽を。 最初の3ビットはすべて1のおよび第4ビットです、それは3バイト文字である0の手段です。 次のバイトは、10から始まる連続バイトであり、それが正しいのです。 しかし、第二の継続のバイトは10で始まっていないので、それは無効です。
ソリューション:
私たちは前のバイトのプリカウントに現在ある場合我々は最初のチェックに必要です。
ない場合は、2例があります。
まず、現在のバイトは1バイトで、スキップします。
第二に、現在のバイトは、複数バイトのバイトをリードしています。以下のバイト数を計算し、プリカウントに割り当てます。
現在のバイトがプリカウント以内であれば、それは10で開始している場合は、チェックを必要とします。
注:1有数チェックするとき、私たちが使用する必要があります(NUM&(1 << 7))= 0ではなく、== 1、そうでない1であるので、それは10000000です!。
時間計算:O(n)を。N = data.length。
スペース:O(1)。
ACのJava:
1 クラスソリューション{ 2 公共 ブール validUtf8(INT []データ){ 3 であれば(データ== NULL || data.length == 0 ){ 4 リターン 真。 5 } 6 7 INTプリカウント= 0 ; 8 INT MASK1 = 1 << 7 。 9 INT MASK2 = 1 << 6 。 10 のために(INT NUM:データ){ 11 であれば(プリカウント== 0 ){ 12 // 1 -バイト 13 であれば((NUM&MASK1)== 0 ){ 14 続けます。 15 } 16 17 int型のカウント= 0 ; 18 INTマスク= 1 << 7 。 19 一方((NUM&マスク)= 0 &&カウント<= 5!){ 20 カウント++ 。 21 マスク=マスク>> 1 。 22 } 23 24 であれば(カウント== 1 ||カウント> 4 ){ 25 リターン 偽。 26 } 27 28 プリカウント=カウント数- 1 。 29 } 他{ 30 であれば(((NUM&MASK1)= 0 &&(NUM&MASK2)== 0! )){ 31 リターン 偽。 32 } 33 34 preCount-- 。 35 } 36 } 37 38 リターンプリカウント== 0 。 39 } 40 }