(G) UTF-8 Validation


UTF-8 Validation

UTF-8有几位空字符,就可以用空字符表示多大的range。

解决这个问题的关键在先设立Mask码,128,192,224,240.知道后面跟了几个byte的有效字符。

  • count==0, 先读mask,知道count

  • else, count--

  • 循环步骤1,2

注意点,

在mask判断时,判断110XXXXX一定要与11100000判断是否等于11000000. 其中&的运算优先级低,需要加括号。严格判断后面有效字符是否以“10”开始。 因为是完全判断,所以之间顺序无所谓。

最后需要判断count==0, 不可直接返回true,否则[237] (11101101), 后面没有3个byte,返回了true。

public class Solution {
    public boolean validUtf8(int[] data) {
        int count = 0;
        for(int i=0;i<data.length;i++){
            if(count==0){
                if((data[i]&128)==0) count = 0;
                else if((data[i]&224)==192) count = 1;
                else if((data[i]&240)==224) count = 2;
                else if((data[i]&248)==240) count = 3;
                else return false;
            }
            else{
                if((data[i]&192)==128)
                    count--;
                else return false;
            }
        }
        return count==0;
    }
}

类似LC三九三,但不是utf8,他给了我一张纸,介绍如何定义他说的编码方式,然后验证给定binary array是不是个合法的编码。Follow up是utf16转换这种编码。虽然一开始理解新的编码方式稍微有点慢,不过最后都写完了,这轮也没什么问题。

results matching ""

    No results matching ""