393. UTF-8 Validation

最后更新

三刷
13-Jan-2017

楞做法,这次尝试写的好看点。

结果写成了一坨。

public class Solution {
    public boolean validUtf8(int[] data) {
        if (data.length == 0) return true;
        int digits = 0;
        for (int i = 0; i < data.length; i++) {
            int num = data[i];
            
            if (((1 << 7) & num) == 0) {
                if (digits != 0) return false;
            } else if ( ( ((1<<7) & num) != 0) && ( ((1<<6) & num) != 0) ) {
                if (digits != 0) return false;
                int j = 0;
                while (((1 << (7-j++)) & num) != 0) {
                    if (++digits == 5) return false;
                }
                digits --;
            } else {
                if (--digits < 0) return false;
            }
        }
        
        return digits == 0;
    }
}


二刷。
22-Nov-2016

还是,看着难,其实很容易。

一部分是理解题,按它的要求检验;另一部分是bit的判断。。

我是最直白的 1 << 7 这种楞移位。。

思路:
总共就4种可能,1-4 bytes。
1 bytes首位是0,直接过。
2-3 要通过读1的个数来判断究竟是几bytes,然后再检验后面跟着的10XXXXXX的个数是不是与判断的几bytes一样。。

要是记住1000000 11000000这种是多少就不用移来移去了。。

Time: O(n) 反正就是得从头撸到尾。
Space: O(1) constant

public class Solution {
    public boolean validUtf8(int[] data) {
        
        int i = 0;
        while (i < data.length) {
            int val = data[i];
            
            // 1 byte
            if (((1 << 7) & val) == 0) {
                i ++;
            } else {
                int one = 1 << 7;
                int bytes = 0;
                // how many 10XXXXXX bytes?
                while ((one & val) != 0) {
                    bytes ++;
                    one = one >>> 1;
                }
                //  has to be 2-4 bytes, must in range 
                if (bytes == 1 || bytes > 4 || bytes + i - 1 >= data.length) {
                    return false;
                }
                
                bytes --;
                ++ i;
                // really 2-4 bytes as expected?
                for (int j = 0; j < bytes; j++) {
                    val = data[j + i];
                    if ((((1 << 7) & val) != 0) && (((1 << 6) & val) == 0)) {
                        
                    } else {
                        return false;
                    }
                }
                i += bytes;
            }
        }
        
        return true;
    }
}

posted @ 2017-01-14 04:23  哇呀呀..生气啦~  阅读(196)  评论(0)    收藏  举报