题目:

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

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

对于 1 字节 的字符,字节的第一位设为 0 ,后面 7 位为这个符号的 unicode 码。
对于 n 字节 的字符 (n > 1),第一个字节的前 n 位都设为1,第 n+1 位设为 0 ,后面字节的前两位一律设为 10 。剩下的没有提及的二进制位,全部为这个符号的 unicode 码。
这是 UTF-8 编码的工作方式:

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
注意:输入是整数数组。只有每个整数的 最低 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/utf-8-validation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

结果:

1,将位运算处理转换为数组处理

2、位运算

解题思路:

1,将位运算处理转换为数组处理

直接把每一个bit存储下来,然后进行判断

2、位运算(详细的可以看看题解)

将通过1的个数计算出byte数进行判断。

n 用于计算当前是几个byte的,注意不能大于4。也就是前4个位中有多少个1.然后就判断后几个数字的开头是1,且第二个数组不为1.

代码:

1

bool validUtf8(int* data, int dataSize){int **bit = (int **)malloc(sizeof(int *) * dataSize);for (int i = 0; i < dataSize; i++) {bit[i] = (int *)malloc(sizeof(int) * 8);int temp = data[i];for (int j = 7; j >= 0; j--) {if (temp & 1 == 1) {bit[i][j] = 1;} else {bit[i][j] = 0;}temp = temp >> 1;}}if (dataSize == 1 && bit[0][0] == 1) {return false;}for (int i = 0; i < dataSize; ) {if (bit[i][0] != 1) {i++;continue;}if (bit[i][1] != 1) {return false;}for (int j = 0; j < 8; j++) {if (bit[i][j] == 1) {if (j == 4 || i + j >= dataSize || bit[i + j][0] != 1) {return false;}} else {i += j;break;}}}return true;
}

2

int MASK1 = (1 << 7);
int MASK2 = (1 << 7) + (1 << 6);int GetByte(int num) {if ((num & MASK1) == 0) {return 1;}int n = 0;int temp = MASK1;while((num & temp) != 0) {n++;if (n > 4) {return -1;}temp >>= 1;}return n >= 2 ? n : -1;
}bool validUtf8(int* data, int dataSize) {for (int i = 0; i < dataSize; ) {int n = GetByte(data[i]);if (n < 0 || i + n > dataSize) {return false;} for (int j = 1; j < n; j++) {if((data[i + j] & MASK2) != MASK1) {return false;}}i += n;}return true;
}

C练题笔记之:Leetcode-393. UTF-8 编码验证相关推荐

  1. C练题笔记之:Leetcode-12. 整数转罗马数字

    题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符          数值 I             1 V             5 X             1 ...

  2. C练题笔记之:Leetcode-307. 区域和检索 - 数组可修改

    题目: 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的n ...

  3. C练题笔记之:Leetcode-303. 区域和检索 - 数组不可变

    题目: 给定一个整数数组  nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= rig ...

  4. C练题笔记之:Leetcode-662. 二叉树最大宽度

    题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 . 树的 最大宽度 是所有层中最大的 宽度 . 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度.将这个二叉树 ...

  5. C练题笔记之:Leetcode-793. 阶乘函数后 K 个零

    题目: f(x) 是 x! 末尾是 0 的数量.回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1 . 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 :而 ...

  6. C练题笔记之:Leetcode-654. 最大二叉树

    题目: 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在最大值 左边 的 子数组前缀上 构建左子 ...

  7. C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀

    题目: 给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成.请你检查检索词 searchWord 是否为句子 sentence ...

  8. C练题笔记之:Leetcode-1184. 公交站间的距离

    题目: 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号.我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之 ...

  9. C练题笔记之:Leetcode-2055. 蜡烛之间的盘子

    题目: 给你一个长桌子,桌子上盘子和蜡烛排成一列.给你一个下标从 0 开始的字符串 s ,它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,'|' 表示一支 蜡烛 . 同时给你一个下 ...

  10. C练题笔记之:Leetcode-565. 数组嵌套

    题目: 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则 ...

最新文章

  1. html语言中 加当前时间,javascript中怎么获取当前时间?
  2. Linux下tmp文件夹的文件自动删除的问题(转)
  3. wsl(windows上运行linux)安装到非C盘解决方案
  4. 互联网金融下一个风口的或许在新农业领域?
  5. 知识图谱论文阅读【十二】【KDD2020】 使用贝叶斯图卷积神经网络推荐精确和多样化项目的框架【看不懂,待续】
  6. 命令行下 mysql 不是内部或外部命令排查方法
  7. ARM处理器之MMU和Cache
  8. [NLP]OpenNLP语句检测器的使用
  9. Atitit 未来趋势把控的书籍 attilax总结 v3
  10. 全网最全Selenium自动化测试相关资源汇总
  11. 学习Java一般多久?
  12. 计算机二级考试场次是随机的,计算机二级考试知多少
  13. 【CSS3】一文搞懂盒子模型
  14. SVG - 在Android中使用矢量图全攻略
  15. 基础版微信模板消息开发详解,附代码PHP
  16. ViewPager + TextView 小说阅读器分页
  17. [转帖]奋斗5年 从月薪3500到700万!
  18. 例程1. LKB -- 慕司板IAP15
  19. 在try-catch机制优化IO流关闭时,OutputStreamWriter 数据流被截断 新语法
  20. php实现tcp连接esp8266,【零知ESP8266教程】WIFI TCP协议通信 TCP客户端示例

热门文章

  1. Oracle错误代码大全
  2. 水煮旅途之“天山夜话”
  3. Linux 计算机网络 从 ping 来初窥计算机网络
  4. 本地数据仓库项目(一) —— 本地数仓搭建详细流程
  5. 进程4G虚拟内存空间的分配
  6. 浅入浅出Javac编译原理——爪哇岛探险(1)
  7. 算算新税率比老费率少扣多少钱 --- 2018年10月1日 新的税收费率改革
  8. 适合大学生、职场人士提高效率的实用性网站。
  9. 我是如何从测试转为产品的
  10. 微信小程序input数据的双向绑定