393. UTF-8 Validation

A character in UTF8 can be from 1 to 4 bytes long, subjected to the following rules:

  1. For 1-byte character, the first bit is a 0, followed by its unicode code.
  2. For n-bytes character, the first n-bits are all one's, the n+1 bit is 0, followed by n-1 bytes with most significant 2 bits being 10.

This is how the UTF-8 encoding would work:

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

Given an array of integers representing the data, return whether it is a valid utf-8 encoding.

Note:

The input is an array of integers. Only the least significant 8 bits of each integer is used to store the data. This means each integer represents only 1 byte of data.

Example 1:

data = [197, 130, 1], which represents the octet sequence: 11000101 10000010 00000001.

Return true.
It is a valid utf-8 encoding for a 2-bytes character followed by a 1-byte character.

Example 2:

data = [235, 140, 4], which represented the octet sequence: 11101011 10001100 00000100.

Return false.
The first 3 bits are all one's and the 4th bit is 0 means it is a 3-bytes character.
The next byte is a continuation byte which starts with 10 and that's correct.
But the second continuation byte does not start with 10, so it is invalid.
算法分析

算法很简单,只需要依次检查每个数字是否是在合法的范围内即可:如果一个数字在0x00~0x7F之间,说明是 1-byte 字符,检查下一个字符;如果一个数字在0xC00xDF之间,则应为2-byte字符,那么接下来的一个数字应该在0x800xBF之间;如果一个数字在0xE00xEF之间,则应为3-byte字符,那么接下来的两个数字应该在0x800xBF之间;如果一个数字在0xF00xF7之间,则应为4-byte字符,那么接下来的三个数字应该在0x800xBF之间。

Java算法实现:

public class Solution {
public boolean validUtf8(int[] data) {
int len=data.length;
int index=0;
int num,num1,num2,num3;
while(index<len){
num=data[index];
num&=0xff;
if(num>=0&&num<=0x7f){
//is 1 byte character
index++;
}
else if(num>=0xc0&&num<=0xdf){
//is 2-byte character
if(index+1<len){
num1=data[index+1];
num1&=0xff;
if(!(num1<=0xbf&&num1>=0x80)){
return false;
}
//the second byte is right
index+=2;
}
else{
return false;
}
}
else if(num>=0xe0&&num<=0xef){
//it is a 3-byte character
if(index+2<len){
num1=data[index+1];
num2=data[index+2];
num1&=0xff;
num2&=0xff;
if(!(num1>=0x80&&num1<=0xbf&&num2>=0x80&&num2<=0xbf)){
return false;
}
index+=3;
}
else{
return false;
}
}
else if(num>=0xf0&&num<=0xf7){
//is a 4-byte character
if(index+3<len){
num1=data[index+1];
num2=data[index+2];
num3=data[index+3];
num1&=0xff;
num2&=0xff;
num3&=0xff;
if(!(num1>=0x80&&num1<=0xbf&&num2>=0x80&&num2<=0xbf&&num3>=0x80&&num3<=0xbf)){
return false;
}
index+=4;
}
else{
return false;
}
}
else{
return false;
}
}
return true;
}
}

LeetCode赛题393----UTF-8 Validation的更多相关文章

  1. LeetCode赛题515----Find Largest Element in Each Row

    问题描述 You need to find the largest element in each row of a Binary Tree. Example: Input: 1 / \ 2 3 / ...

  2. LeetCode赛题----Find Left Most Element

    问题描述 Given a binary tree, find the left most element in the last row of the tree. Example 1: Input: ...

  3. LeetCode赛题395----Longest Substring with At Least K Repeating Characters

    395. Longest Substring with At least K Repeating Characters Find the length of the longest substring ...

  4. LeetCode赛题394----Decode String

    394. Decode String Given an encoded string, return it's decoded string. The encoding rule is: k[enco ...

  5. LeetCode赛题392---- Is Subsequence

    392. Is Subsequence Given a string s and a string t, check if s is subsequence of t. You may assume ...

  6. LeetCode赛题391----Perfect Rectangle

    #391. Perfect Rectangle Given N axis-aligned rectangles where N > 0, determine if they all togeth ...

  7. LeetCode赛题390----Elimination Game

    # 390. Elimination Game There is a list of sorted integers from 1 to n. Starting from left to right, ...

  8. C#LeetCode刷题-位运算

    位运算篇 # 题名 刷题 通过率 难度 78 子集   67.2% 中等 136 只出现一次的数字 C#LeetCode刷题之#136-只出现一次的数字(Single Number) 53.5% 简单 ...

  9. 这样leetcode简单题都更完了

    这样leetcode简单题都更完了,作为水题王的我开始要更新leetcode中等题和难题了,有些挖了很久的坑也将在在这个阶段一一揭晓,接下来的算法性更强,我就要开始分专题更新题目,而不是再以我的A题顺 ...

随机推荐

  1. Eclipse 的SVN 的分支

    分支 概念 在版本控制过程中,使用多个分支同时推进多个不同功能开发.   不使用分支开发:人与人之间协作   使用分支开发:小组和小组之间协作 作用  多个功能开发齐头并进同时进行 任何一个分支上功能 ...

  2. FCN详解

    转载自:https://www.cnblogs.com/gujianhan/p/6030639.html 论文地址:https://arxiv.org/pdf/1411.4038v1.pdf 背景 C ...

  3. Java8内存结构—永久代(PermGen)和元空间(Metaspace)

    本文转载 作者:liuxiaopeng 博客地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分 ...

  4. POJ_3470 Walls 【离散化+扫描线+线段树】

    一.题面 POJ3470 二.分析 POJ感觉是真的老了. 这题需要一些预备知识:扫描线,离散化,线段树.线段树是解题的关键,因为这里充分利用了线段树区间修改的高效性,再加上一个单点查询. 为什么需要 ...

  5. windows下python3.7.2内置venv虚拟环境下pyinstaller错误问题

    起因 开发一直使用python -m venv .pyenv 方式创建虚拟环境,在利用pyinstaller打包发布应用时,出现错误 3178 INFO: Warnings written to C: ...

  6. Mac下一台电脑管理多个SSH KEY(转)

    一.关于ssh是什么? http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html 二.需求: 一台电脑上(Mac os)管理多个ssh ...

  7. (转)我是如何在SQLServer中处理每天四亿三千万记录的

    首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...

  8. SPSS学习系列之SPSS Statistics的菜单栏介绍(图文详解)

    不多说,直接上干货! 以下是菜单栏 1.以下是文件栏: 2.以下是编辑栏 3.以下是查看栏   4.以下是数据栏: 5.以下是转换栏: 6.以下是分析栏: 7.以下是直销栏: 8.以下是图形栏: 9. ...

  9. StackMapTable属性说明

    (1)StackMapTable属性的说明 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.7.4 (2)S ...

  10. MySQL之mysql命令使用详解

    MySQL Name mysql - the MySQL command-line tool Synopsis mysql [options] db_name Description mysql is ...