LC393

题目

 

今天的题目真恶心,好多特殊情况,一下我总结了一下我遇到的坑

1.字符长度1~4字节,这就意味着单个字节开头最多4个1,超过的为false

2.以10开头的字节不能单独出现

3.要注意数组越界的情况,比如所某个字节开头三个1,但是它后面只有一个字节了,这样就会出现数组越界的情况

考虑到了所有的特殊情况之后就是简单的模拟了

 1 class Solution {
 2     public boolean validUtf8(int[] data) {
 3         toBinary(data);
 4         int len = data.length; 
 5         for(int i = 0; i < len; i++){
 6             String str = String.valueOf(data[i]);
 7             int n = i;
 8             if(str.length() == 8){
 9                 for(int j = 0; j < 8; j++){
10                     if(str.charAt(j) == '1'){
11                         n++;
12                     }else{
13                         break;
14                     }
15                 }
16             }
17             if(n == (i+1) || (n - i) > 4){
18                 return false;
19             }
20             while(i < (n - 1)){
21                 i++;
22                 if(i >= len){
23                     return false;
24                 }
25                 String str2 = String.valueOf(data[i]);
26                 if(!(str2.charAt(0) == '1' && str2.charAt(1) == '0') || str2.length() < 8){
27                     return false;
28                 }
29             }
30         }
31         return true;
32     }
33     public void toBinary(int[] data){
34         int len = data.length;
35         for(int i = 0; i < len; i++){
36             int num = data[i];
37             int p = 0;
38             int temp = 0;
39             while(num > 0){
40                 temp += (num % 2) * Math.pow(10,p++);
41                 num /= 2;
42             }
43             data[i] = temp;
44         }
45     }
46 }

位运算也能解

posted @ 2022-03-13 11:13  雨下_整夜  阅读(23)  评论(0编辑  收藏  举报