题目描述
遍历 + 位运算
对于从 data [ index ] \textit{data}[\textit{index}] data[index] 开始的 UTF-8 \text{UTF-8} UTF-8 字符,可根据 data [ index ] \textit{data}[\textit{index}] data[index] 的值得到该字符的长度 n n n,如果下一个 UTF-8 \text{UTF-8} UTF-8 字符存在,则下一个 UTF-8 \text{UTF-8} UTF-8 字符从下标 index + n \textit{index} + n index+n 开始。
遍历数组 data \textit{data} data 得到每个字符的开始下标和长度,并分别判断每个字符是否符合 UTF-8 \text{UTF-8} UTF-8 编码的规则。
class Solution {
public boolean validUtf8(int[] data) {
int n = data.length;
int k = 0;
while (k < n) {
int num = data[k];
int nByte = getNByte(num);
if (nByte == -1 || nByte + k > n) {
return false;
}
for (int i = 1; i <= nByte - 1; i++) {
// 10 开头
if (((data[i + k] >>> 6) & 2) != 2) {
return false;
}
}
k += (nByte);
}
return true;
}
// n 字节
private int getNByte(int num) {
if (((num >>> 7) & 1) == 0) {
// 1 字节的字符
return 1;
}
int res = 0;
int move = 7;
while (((num >>> move) & 1) == 1 ) {
res++;
// 每个 UTF-8 字符由 1 到 4 个字节组成
if (res > 4) {
return -1;
}
move--;
}
return res <= 1 ? -1 : res;
}
}
-
时间复杂度: O ( m ) O(m) O(m),其中 m m m 是数组 data \textit{data} data 的长度。需要遍历数组 data \textit{data} data 一次,对于数组中的每个元素的计算时间都是 O ( 1 ) O(1) O(1)。
-
空间复杂度: O ( 1 ) O(1) O(1)。