做个网站要多少钱 一般,有没有做网站的博士专业,wordpress qq微信登陆,php网站开发框架有哪些文章目录摘要描述题解答案题解代码分析为什么要取低 8 位首字节的四种情况延续字节变量 need 的含义示例 1 简要过程示例 2 简要过程示例测试及结果示例 1#xff1a;data [197, 130, 1]示例 2#xff1a;data [235, 140, 4]示例 3#xff1a;仅单字节示例 4#xff1a;截…文章目录摘要描述题解答案题解代码分析为什么要取低 8 位首字节的四种情况延续字节变量 need 的含义示例 1 简要过程示例 2 简要过程示例测试及结果示例 1data [197, 130, 1]示例 2data [235, 140, 4]示例 3仅单字节示例 4截断示例 5多余延续字节时间复杂度空间复杂度实际应用场景总结摘要这道题要求判断一个整数数组是否构成合法的 UTF-8 编码。每个整数只取低 8 位代表一个字节我们要按照 UTF-8 的规则检查单字节是 0 开头多字节字符由「首字节前 n 位为 1、第 n1 位为 0」和后续「延续字节前两位为 10」组成。做法就是顺序扫描数组遇到首字节就根据前缀确定该字符占几字节并预期后面有多少个延续字节遇到延续字节就扣掉预期数。若某字节既不是合法首字节、也不是预期内的延续字节或扫完后还欠延续字节就返回 false。下面用 Swift 实现并说明细节。描述给定一个表示数据的整数数组data返回它是否为有效的UTF-8编码。UTF-8 中一个字符可能的长度为1 到 4 字节规则如下1 字节首位为 0即0xxxxxxx。n 字节n 1首字节前 n 位为 1、第 n1 位为 0后面每个字节前两位为10即延续字节。Number of Bytes | UTF-8 octet sequence (binary) ----------------------------------------------------------------- 1 | 0xxxxxxx 2 | 110xxxxx 10xxxxxx 3 | 1110xxxx 10xxxxxx 10xxxxxx 4 | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx注意输入为整数数组只用每个整数的最低 8 位表示一个字节。示例 1输入 data [197,130,1] 输出 true 解释 19711000101, 13010000010, 100000001。前两字节构成一个 2 字节字符第三字节是 1 字节字符。示例 2输入 data [235,140,4] 输出 false 解释 23511101011 为 3 字节首字节14010001100 为延续字节正确400000100 不是延续字节无效。提示1 data.length 2 * 10^40 data[i] 255核心思路顺序遍历用「当前还差几个延续字节」来驱动状态首字节决定后续个数延续字节必须形如10xxxxxx。题解答案classSolution{funcvalidUtf8(_data:[Int])-Bool{varneed0// 当前多字节字符还需要的延续字节个数fornumindata{letbytenum0xFFifneed0{// 期望一个首字节if(byte0x80)0{continue// 0xxxxxxx1 字节}if(byte0xE0)0xC0{need1continue// 110xxxxx2 字节}if(byte0xF0)0xE0{need2continue// 1110xxxx3 字节}if(byte0xF8)0xF0{need3continue// 11110xxx4 字节}returnfalse// 非法首字节}else{// 期望延续字节 10xxxxxxif(byte0xC0)0x80{need-1continue}returnfalse}}returnneed0}}题解代码分析为什么要取低 8 位题目说明每个整数只表示 1 字节即只用低 8 位。用byte num 0xFF可以屏蔽高位避免超出 0–255 的输入或符号位影响位运算。首字节的四种情况1 字节(byte 0x80) 0即最高位为 0。2 字节(byte 0xE0) 0xC0即前三位为 110后面 5 位任意。3 字节(byte 0xF0) 0xE0前四位 1110。4 字节(byte 0xF8) 0xF0前五位 11110。若都不满足说明既不是合法单字节也不是 2/3/4 字节的首字节直接返回 false。延续字节多字节字符中首字节之后的字节必须是延续字节前两位为10即(byte 0xC0) 0x80。每遇到一个合法延续字节need - 1若当前字节不是延续字节返回 false。变量 need 的含义need表示「当前这个多字节字符还差几个延续字节」。遇到 2 字节首字节则need 13 字节则need 24 字节则need 3每读一个延续字节就减 1。若遍历结束时need ! 0说明最后一个字符被截断也应返回 false。示例 1 简要过程data [197, 130, 1]197 0xFF 197197 0xE0 0xC0故为 2 字节首字节need 1。130 0xC0 0x80延续字节need 0。1 0x80 0单字节。结束 need 0返回 true。示例 2 简要过程data [235, 140, 4]235 0xF0 0xE03 字节首字节need 2。140 0xC0 0x80延续字节need 1。4 0xC0 0不是延续字节返回 false。示例测试及结果示例 1data [197, 130, 1]2 字节字符 1 字节字符结构合法返回true。示例 2data [235, 140, 4]3 字节首字节后跟一个延续字节第三个字节 4 不是延续字节返回false。示例 3仅单字节data [0, 127, 65] 均为 0xxxxxxx返回true。示例 4截断data [0xC0]2 字节首字节后没有延续字节need 最终为 1返回false。示例 5多余延续字节若 data 开头就是 10000000延续字节此时 need 为 0该字节既不是合法首字节也不是预期延续字节返回false。时间复杂度遍历数组一遍每个整数只做常数次位运算和比较O(n)n 为data.length。空间复杂度只用了变量need和循环中的byteO(1)。实际应用场景网络或文件读到的字节流在按 UTF-8 解析前常先做一次合法性校验避免解码到一半报错。日志、配置或用户输入若以字节序列形式传入可用同样逻辑快速判断是否为合法 UTF-8再决定是否解码或告警。总结UTF-8 验证只需按规则顺序扫描用need记录当前还缺几个延续字节首字节通过位掩码判断是 1/2/3/4 字节并设置need延续字节必须满足10xxxxxx并递减need。最后若need 0且未在中途非法则返回 true。实现简单适合作为字节流校验的模板写法。