• 【C语言刷LeetCode】717. 1 比特与 2 比特字符(E)


    有两种特殊字符:

    第一种字符可以用一比特 0 表示
    第二种字符可以用两比特(10 或 11)表示
    给你一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一个一比特字符,则返回 true 。

    示例 1:

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

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

    提示:

    1 <= bits.length <= 1000
    bits[i] 为 0 或 1

    来源:力扣(LeetCode
    链接:https://leetcode.cn/problems/1-bit-and-2-bit-characters
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    这道题首先要读懂题意,然后需要逆序遍历。

    逆序遍历优势在于不用遍历完全部数组

    关键点是只有 “0”,“10”,“11” 三种编码。 

    首先,观察数组最后一位,题干中说了,肯定是 0,但是我们不能确定是 “0” 还是 “10”,

    所以采取的策略是:看看这个 0 前面有多少个**连续**的 1,

    为什么是连续呢 ? 因为我们只要碰到 0 时,不管是 “0” 也好, “10” 也好,都代表着一个字符的结尾。

    注意:没有 “1” 这个编码!我们只需看看连续的 1 个数是奇数还是偶数,

    如果是偶数,代表这些连续的 1 都组成了“11”,

    如果是奇数,代表最后一个“1”落单了,由于没有 “1” 这个编码,所以只能和最后一位 “0” 进行配对了。

    1. bool isOneBitCharacter(int* bits, int bitsSize){
    2. int i;
    3. int cnt = 0;
    4. for (i = bitsSize - 2; i >= 0; i--) { // 求最后又多少个连续的1
    5. if (bits[i] == 1) {
    6. cnt++;
    7. } else {
    8. break;
    9. }
    10. }
    11. if (cnt % 2 == 0) {
    12. return true;
    13. } else {
    14. return false;
    15. }
    16. }

  • 相关阅读:
    简单理解算法篇--贪心算法
    k8s pod 处于Terminating的原因分析和解决处理——筑梦之路
    Python猜数字小游戏
    【分立元件】贴片电阻过电压故障机理
    LeetCode 46. 全排列
    JAVA生成图片缩略图、JAVA截取图片局部内容
    基于Gin框架的HTTP接口限速实践
    redis雪崩问题
    PowerDesigner反向导入表+PowerDesigner的ER图设计+PowerDesigner连接外键的线(版本16.5)
    点云绪论(点云数据及获取、点云数据处理、常用软件及开源库)
  • 原文地址:https://blog.csdn.net/jin615567975/article/details/126882140