返回介绍

solution / 0300-0399 / 0393.UTF-8 Validation / README

发布于 2024-06-17 01:04:01 字数 4018 浏览 0 评论 0 收藏 0

393. UTF-8 编码验证

English Version

题目描述

给定一个表示数据的整数数组 data ,返回它是否为有效的 UTF-8 编码。

UTF-8 中的一个字符可能的长度为 1 到 4 字节,遵循以下的规则:

  1. 对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。
  2. 对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。

这是 UTF-8 编码的工作方式:

    </code>Number of Bytes<code>  |    UTF-8 octet sequence
             |        (binary)
   --------------------+---------------------------------------------
      1      | 0xxxxxxx
      2      | 110xxxxx 10xxxxxx
      3      | 1110xxxx 10xxxxxx 10xxxxxx
      4      | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

x 表示二进制形式的一位,可以是 0 或 1

注意:输入是整数数组。只有每个整数的 最低 8 个有效位 用来存储数据。这意味着每个整数只表示 1 字节的数据。

 

示例 1:

输入:data = [197,130,1]
输出:true
解释:数据表示字节序列:11000101 10000010 00000001。
这是有效的 utf-8 编码,为一个 2 字节字符,跟着一个 1 字节字符。

示例 2:

输入:data = [235,140,4]
输出:false
解释:数据表示 8 位的序列: 11101011 10001100 00000100.
前 3 位都是 1 ,第 4 位为 0 表示它是一个 3 字节字符。
下一个字节是开头为 10 的延续字节,这是正确的。
但第二个延续字节不以 10 开头,所以是不符合规则的。

 

提示:

  • 1 <= data.length <= 2 * 104
  • 0 <= data[i] <= 255

解法

方法一

class Solution:
  def validUtf8(self, data: List[int]) -> bool:
    n = 0
    for v in data:
      if n > 0:
        if v >> 6 != 0b10:
          return False
        n -= 1
      elif v >> 7 == 0:
        n = 0
      elif v >> 5 == 0b110:
        n = 1
      elif v >> 4 == 0b1110:
        n = 2
      elif v >> 3 == 0b11110:
        n = 3
      else:
        return False
    return n == 0
class Solution {
  public boolean validUtf8(int[] data) {
    int n = 0;
    for (int v : data) {
      if (n > 0) {
        if (v >> 6 != 0b10) {
          return false;
        }
        --n;
      } else if (v >> 7 == 0) {
        n = 0;
      } else if (v >> 5 == 0b110) {
        n = 1;
      } else if (v >> 4 == 0b1110) {
        n = 2;
      } else if (v >> 3 == 0b11110) {
        n = 3;
      } else {
        return false;
      }
    }
    return n == 0;
  }
}
class Solution {
public:
  bool validUtf8(vector<int>& data) {
    int n = 0;
    for (int& v : data) {
      if (n > 0) {
        if (v >> 6 != 0b10) return false;
        --n;
      } else if (v >> 7 == 0)
        n = 0;
      else if (v >> 5 == 0b110)
        n = 1;
      else if (v >> 4 == 0b1110)
        n = 2;
      else if (v >> 3 == 0b11110)
        n = 3;
      else
        return false;
    }
    return n == 0;
  }
};
func validUtf8(data []int) bool {
  n := 0
  for _, v := range data {
    if n > 0 {
      if v>>6 != 0b10 {
        return false
      }
      n--
    } else if v>>7 == 0 {
      n = 0
    } else if v>>5 == 0b110 {
      n = 1
    } else if v>>4 == 0b1110 {
      n = 2
    } else if v>>3 == 0b11110 {
      n = 3
    } else {
      return false
    }
  }
  return n == 0
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文