0
点赞
收藏
分享

微信扫一扫

【220220】717. 1比特与2比特字符

星河出山 2022-02-21 阅读 84

我的解法

找规律

当前第 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;
    }
}

黄金解法

核心:倒序遍历
优势:不用完全遍历
思路:

  1. 找到(对于最后一位为0来说の)最后一个一位字符,即倒数第二个0
  2. 那么这两个0中间的都是1
  3. 规律:连续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$");
    }
}
举报

相关推荐

0 条评论