C练题笔记之:Leetcode-393. UTF-8 编码验证
题目:
给定一个表示数据的整数数组 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 编码验证相关推荐
- C练题笔记之:Leetcode-12. 整数转罗马数字
题目: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M. 字符 数值 I 1 V 5 X 1 ...
- C练题笔记之:Leetcode-307. 区域和检索 - 数组可修改
题目: 给你一个数组 nums ,请你完成两类查询. 其中一类查询要求 更新 数组 nums 下标对应的值 另一类查询要求返回数组 nums 中索引 left 和索引 right 之间( 包含 )的n ...
- C练题笔记之:Leetcode-303. 区域和检索 - 数组不可变
题目: 给定一个整数数组 nums,处理以下类型的多个查询: 计算索引 left 和 right (包含 left 和 right)之间的 nums 元素的 和 ,其中 left <= rig ...
- C练题笔记之:Leetcode-662. 二叉树最大宽度
题目: 给你一棵二叉树的根节点 root ,返回树的 最大宽度 . 树的 最大宽度 是所有层中最大的 宽度 . 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度.将这个二叉树 ...
- C练题笔记之:Leetcode-793. 阶乘函数后 K 个零
题目: f(x) 是 x! 末尾是 0 的数量.回想一下 x! = 1 * 2 * 3 * ... * x,且 0! = 1 . 例如, f(3) = 0 ,因为 3! = 6 的末尾没有 0 :而 ...
- C练题笔记之:Leetcode-654. 最大二叉树
题目: 给定一个不重复的整数数组 nums . 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值. 递归地在最大值 左边 的 子数组前缀上 构建左子 ...
- C练题笔记之:Leetcode-1455. 检查单词是否为句中其他单词的前缀
题目: 给你一个字符串 sentence 作为句子并指定检索词为 searchWord ,其中句子由若干用 单个空格 分隔的单词组成.请你检查检索词 searchWord 是否为句子 sentence ...
- C练题笔记之:Leetcode-1184. 公交站间的距离
题目: 环形公交路线上有 n 个站,按次序从 0 到 n - 1 进行编号.我们已知每一对相邻公交站之间的距离,distance[i] 表示编号为 i 的车站和编号为 (i + 1) % n 的车站之 ...
- C练题笔记之:Leetcode-2055. 蜡烛之间的盘子
题目: 给你一个长桌子,桌子上盘子和蜡烛排成一列.给你一个下标从 0 开始的字符串 s ,它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,'|' 表示一支 蜡烛 . 同时给你一个下 ...
- C练题笔记之:Leetcode-565. 数组嵌套
题目: 索引从0开始长度为N的数组A,包含0到N - 1的所有整数.找到最大的集合S并返回其大小,其中 S[i] = {A[i], A[A[i]], A[A[A[i]]], ... }且遵守以下的规则 ...
最新文章
- html语言中 加当前时间,javascript中怎么获取当前时间?
- Linux下tmp文件夹的文件自动删除的问题(转)
- wsl(windows上运行linux)安装到非C盘解决方案
- 互联网金融下一个风口的或许在新农业领域?
- 知识图谱论文阅读【十二】【KDD2020】 使用贝叶斯图卷积神经网络推荐精确和多样化项目的框架【看不懂,待续】
- 命令行下 mysql 不是内部或外部命令排查方法
- ARM处理器之MMU和Cache
- [NLP]OpenNLP语句检测器的使用
- Atitit 未来趋势把控的书籍 attilax总结 v3
- 全网最全Selenium自动化测试相关资源汇总
- 学习Java一般多久?
- 计算机二级考试场次是随机的,计算机二级考试知多少
- 【CSS3】一文搞懂盒子模型
- SVG - 在Android中使用矢量图全攻略
- 基础版微信模板消息开发详解,附代码PHP
- ViewPager + TextView 小说阅读器分页
- [转帖]奋斗5年 从月薪3500到700万!
- 例程1. LKB -- 慕司板IAP15
- 在try-catch机制优化IO流关闭时,OutputStreamWriter 数据流被截断 新语法
- php实现tcp连接esp8266,【零知ESP8266教程】WIFI TCP协议通信 TCP客户端示例