目录

1bit与2bit字符——简单模拟题


题目

题目链接

https://img-blog.csdnimg.cn/ae37ee7fede04a2ea944abd58baf6122.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAQysrKysrKysrKysrKysrKysrKys=,size_17,color_FFFFFF,t_70,g_se,x_16

题目详解

读懂题

此题是为了让最后以一个字符解码,也就是 $0$ ,而含 $1$ 的只能是两个字符进行解码,所以遇到 $1$ 就必须确保后面有 $0$ 或 $1$ 来用于抵消。

解题法

  1. 法一:正向遍历法 直接通过遇到 $0$ 走一步,遇到 $1$ 走两步,再看最后是否能恰好走到最后一个 $0$ 的位置,如果能则 $true$ 否则 $false$ 。
  2. 法二:反向遍历法 由于遇到 $0$ 能直接跳过,而遇到 $1$ 则后面必须含有一个字符被抵消,所以为了让最后一个 $0$ 不被抵消,它前面的连续 $1$ 应该要为偶数个,否则 $0$ 将会被抵消。故具体做法直接记录最后一个 $0$ 前面的 $1$ 的个数即可得出答案。

解题代码

法一

class Solution {
public:
    bool isOneBitCharacter(vector<int>& bits) {
        int sz = bits.size();
        if(sz<2)
            return true;
        int start = 0;
        while(start<sz-1){
            if(bits[start]==0)
                start++;
            else{
                start += 2;
            }
        }
        return start==sz-1;
    }
};

法二

class Solution {
public:
    bool isOneBitCharacter(vector<int>& bits) {
        return find(rbegin(bits)+1, rend(bits), 0) - rbegin(bits) & 1;
    }
};