我的解法
找规律
当前第 i 位为0,只能划分为一位字符,判断下一位;
当前第 i 位为1,只能划分为两位字符,判断 i+2 位;
采用递归,出口【start==length
时,最后一个字符为两位字符,返回false;start+1==length
时,最后一个字符为一位字符,返回true】;
class Solution {
public boolean isOneBitCharacter(int[] bits) {
return myOneBitCharacter(bits,0);
}
public boolean myOneBitCharacter(int[] bits, int start) {
int n=bits.length;
if(n==start) {
return false;
}
else if(n==start+1) {
return bits[start]==0;
}
if(bits[start]==1) {
return myOneBitCharacter(bits,start+2);
}
else {
return myOneBitCharacter(bits,start+1);
}
}
}
青铜解法
- 遇到 0 走一步
- 遇到 1 走两步
如果最后一位恰好到达length-1,说明最后一个数字的长度为 1 ,也就是 0。
//官方题解
class Solution {
public boolean isOneBitCharacter(int[] bits) {
int n = bits.length, i = 0;
while (i < n - 1) {
i += bits[i] + 1;
}
return i == n - 1;
}
}
黄金解法
核心:倒序遍历
优势:不用完全遍历
思路:
- 找到(对于最后一位为0来说の)最后一个一位字符,即倒数第二个0
- 那么这两个0中间的都是1
- 规律:连续1只能成双。即我们可以通过判断【连续1的个数】是否为偶数来判断最后一个字符是否为第一种字符。
//官方题解
class Solution {
public boolean isOneBitCharacter(int[] bits) {
int n = bits.length, i = n - 2;
while (i >= 0 && bits[i] == 1) {
--i;
}
return (n - i) % 2 == 0;
}
}
白银解法:正则
/*
@v7fgg
执行用时:15 ms, 在所有 Java 提交中击败
内存消耗:42 MB, 在所有 Java 提交中击败了5.01%的用户
2022年2月19日 10:00
*/
class Solution {
public boolean isOneBitCharacter(int[] bits) {
return Arrays.toString(bits).replaceAll("[\\[\\]\\s,]","").matches("(10|11|0)*0$");
}
}