zoukankan      html  css  js  c++  java
  • 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;
        }
    }
    
    
  • 相关阅读:
    博客的开端,找对象不再new
    OpenGL编程 基础篇(六)OpenGL中几种光照参数
    OpenGL编程 基础篇(五)世界窗口和视口
    百练2952:循环数
    百练2811:熄灯问题
    百练2812:恼人的青蛙
    百练3177:判决素数个数
    百练1248:Safecracker
    OpenGL编程 基础篇(四)与鼠标的交互
    OpenGL编程 基础篇(三)用点集绘制函数
  • 原文地址:https://www.cnblogs.com/reboot329/p/5875861.html
Copyright © 2011-2022 走看看