最后更新
三刷
13-Jan-2017
楞做法,这次尝试写的好看点。
结果写成了一坨。
public class Solution {
public boolean validUtf8(int[] data) {
if (data.length == 0) return true;
int digits = 0;
for (int i = 0; i < data.length; i++) {
int num = data[i];
if (((1 << 7) & num) == 0) {
if (digits != 0) return false;
} else if ( ( ((1<<7) & num) != 0) && ( ((1<<6) & num) != 0) ) {
if (digits != 0) return false;
int j = 0;
while (((1 << (7-j++)) & num) != 0) {
if (++digits == 5) return false;
}
digits --;
} else {
if (--digits < 0) return false;
}
}
return digits == 0;
}
}
二刷。
22-Nov-2016
还是,看着难,其实很容易。
一部分是理解题,按它的要求检验;另一部分是bit的判断。。
我是最直白的 1 << 7 这种楞移位。。
思路:
总共就4种可能,1-4 bytes。
1 bytes首位是0,直接过。
2-3 要通过读1的个数来判断究竟是几bytes,然后再检验后面跟着的10XXXXXX的个数是不是与判断的几bytes一样。。
要是记住1000000 11000000这种是多少就不用移来移去了。。
Time: O(n) 反正就是得从头撸到尾。
Space: O(1) constant
public class Solution {
public boolean validUtf8(int[] data) {
int i = 0;
while (i < data.length) {
int val = data[i];
// 1 byte
if (((1 << 7) & val) == 0) {
i ++;
} else {
int one = 1 << 7;
int bytes = 0;
// how many 10XXXXXX bytes?
while ((one & val) != 0) {
bytes ++;
one = one >>> 1;
}
// has to be 2-4 bytes, must in range
if (bytes == 1 || bytes > 4 || bytes + i - 1 >= data.length) {
return false;
}
bytes --;
++ i;
// really 2-4 bytes as expected?
for (int j = 0; j < bytes; j++) {
val = data[j + i];
if ((((1 << 7) & val) != 0) && (((1 << 6) & val) == 0)) {
} else {
return false;
}
}
i += bytes;
}
}
return true;
}
}