• 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;
        }
    }
    
    
  • 相关阅读:
    jsp页面input输入框限制输入内容
    sql计算两个日期之间的相差天数
    sql根据一个字段日期加减7天存入另一字段中
    ajax请求捕获异常
    跨网段和局域网的SQL SERVER发布订阅配置图解和常见问题
    一次得到多个数据集
    SQL Server 2008语句大全完整版
    关于已开票已收款未发货的账务处理
    高格-一些特点话题【7】
    高格-塑料管业中厂内工单,满足随时换料的处理【6】
  • 原文地址:https://www.cnblogs.com/reboot329/p/5875861.html
Copyright © 2020-2023  润新知