Leetcode 393

判断给定的字符序列是不是一个有效的UTF-8编码

 

这个题目看懂题目就很简单的,首先要知道UTF-8是个不定长的编码,也就是说每个字符的长度可能是1-4个字节,具体是怎么表示的呢?

第一个字节如果第一位0,那么它自己表示一个字符

如果前三位是110,那么表示当前字节和接下来的一个字节一起表示一个字符,并且后面的字节前两位都是10

如果前四位是1110,那么表示当前字节和接下来的两个字节一起表示一个字符,并且后面的字节前两位都是10

如果前五位是11110,那么表示当前字节和接下来的三个字节一起表示一个字符,并且后面的字节前两位都是10

 

如图表示

   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
    public boolean validUtf8(int[] data) {
        int c = 0;
        for (int d : data) {
            if (c == 0) {
                if (d >> 5 == 0b110) c = 1;
                else if (d >> 4 == 0b1110) c = 2;
                else if (d >> 3 == 0b11110) c = 3;
                else if ((d >> 7) != 0) return false;
            } else {
                if (d >> 6 != 0b10) return false;
                c--;
            }
        }
        return c == 0;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值