LeetCode笔记:717. 1-bit and 2-bit Characters

问题(Easy):

We have two special characters. The first character can be represented by one bit 0. The second character can be represented by two bits (10 or 11).

Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero.

Example 1:
Input:
bits = [1, 0, 0]
Output: True
Explanation:
The only way to decode it is two-bit character and one-bit character. So the last character is one-bit character.

Example 2:
Input:
bits = [1, 1, 1, 0]
Output: False
Explanation:
The only way to decode it is two-bit character and two-bit character. So the last character is NOT one-bit character.

Note:

  • 1 <= len(bits) <= 1000.
  • bits[i] is always 0 or 1.

大意:

我们有两个特殊的字符,第一个字符可以用一个比特的0表示,第二个字符可以用两个比特(10或者11)表示。

现在给出一个多个比特组成的字符串。返回最后一个字符是否必须是一比特的字符。给出的字符串总是以0结尾。

例1:
输入:
bits = [1, 1, 1, 0]
输出:True
解释:
唯一的解码方式是两比特的字符串和一比特的字符。所以最后一个字符是一比特的字符。

例2:
输入:
bits = [1, 1, 1, 0]
输出:False
解释:
唯一的解码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。

注意:

  • 1 <= len(bits) <= 1000。
  • bits[i]永远是0或1。

思路:

我们可以找一下规律:

如果只有一个0肯定是单字符;

如果有两个数字,看倒数第二个是1还是0就可以判断,是1则可以是双字符;

如果有三个数字。看倒数第二、第三个数字是什么,也就是最后的0前面是什么,如果是“010”,则可以双字符,如果是“110”,则只能单字符,如果“100”或者“000”,肯定也只能单字符,也即是说,0前面如果紧跟着单数个1,则可以双字符,如果是双数个1(比如0个或2个),则只能单字符,这个规律对不对呢?

假设有五个数字,最后的0前有双数个1的话,比如“11110”、“00110”都只能单字符,如果最后的0前是单数个1的话,比如“01110”、“00010”,则可以双字符,看来这个规律是对的,所以只用判断最后的0前连续的1的个数是单还是双即可。

代码(C++):

class Solution {
public:
    bool isOneBitCharacter(vector<int>& bits) {
        int len = bits.size();
        if (len == 1) return true;
        if (bits[len-2] == 0) return true;
        else {
            int num = 1;
            int index = len - 3;
            while (index >= 0) {
                if (bits[index] == 1) num++;
                else break;
                index--;
            }
            if (num % 2 == 0) return true;
        }
        return false;
    }
};

他山之石

看到别人的一个方法,遍历一遍数组内容,遇到1则前进两步(因为1开头一定是包含两个比特的),遇到0则前进一步。遇到1则令结果变量为false,遇到0则令结果变量为true,也就是说,当遍历完时,如果最后走的一步恰好为遇到1时的两步,则返回为false,如果最后走的一步是遇到0时的一步,则返回为true。

class Solution {
public:
    bool isOneBitCharacter(vector<int>& bits) {
        bool c;
        for (int i = 0; i < bits.size();) {
            if (bits[i]) c = 0, i+=2;
            else c = 1, ++i;
        }
        return c;
    }
};

合集:https://github.com/Cloudox/LeetCode-Record


查看作者首页

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Lua 5.1 参考手册 by Roberto Ierusalimschy, Luiz Henrique de F...
    苏黎九歌阅读 14,764评论 0 38
  • 最近头晕的厉害,也顾不上写日记了。感恩今天社区医疗活动,帮我量血压正常,社区纯净水办卡活动,不仅送水还帮我...
    Miss微微恩阅读 1,342评论 0 0
  • 通过今天的早读,我了解到狐狸和小男孩因为训养,成为了彼此的唯一! 现实生活中: 我们会因为某种关系,变得更加亲密。...
    后知后觉的持续努力阅读 1,805评论 0 0
  • 今天开始学架子鼓~~~感觉很棒~ 老师说学架子鼓的女生十有八废,我希望我是另外的十分之二。 多练习鼓,打好基础~加...
    安长乐阅读 1,828评论 0 0
  • 目录1.mybatis中大于等于小于等于的写法2.mybatis动态查询条件组装3.mybatis批量条件4.my...
    挑战者666888阅读 9,102评论 0 5

友情链接更多精彩内容