开启我的LeetCode刷题日记:717. 1 比特与 2 比特字符

215 阅读3分钟

「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战

编程世界总是离不了算法

最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力

于是决定蹭着假期,加强算法和数据结构相关的知识

那怎么提升呢?

其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅

第一阶段目标是:200道,每天12

为了不乱,本系列文章目录分为三部分:

  1. 今日题目:xxx
  2. 我的思路
  3. 代码实现

今天题目:717. 1 比特与 2 比特字符

有两种特殊字符:

第一种字符可以用一比特 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) 链接:leetcode-cn.com/problems/1-… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的思路

题目要求最后一位必须是由第一种字符来构造,因此可以预先将其截断出来,然后检索剩余的比特数组(下标范围为 [0, n-1])是否可以按构造规则进行构造完毕,这里的完毕是为了确保剩余的字符仅可由这两种规则构造

由此,算法思路为:

从下标 i=0 开始遍历 对于遍历项,进行如下判断: 如果遍历项为0,则表示符合第一种字符构造规则,继续遍历下一位,更新遍历项下标 i+=1 如果遍历项为1,则判断下一位遍历项下标是否仍在 **[0, n-1]**里,表示尚未越界,更新遍历项下标 i+=2 否则,表示无法用上述两种规则构造,该比特单独成组,返回 false 遍历结束,剩余比特项可由两种字符构造,返回 true

代码实现

/**
 * @param {number[]} bits
 * @return {boolean}
 */
var isOneBitCharacter = function(bits) {

    // 去除最后一位第一种字符
    const n = bits.length - 1;

    for(let i=0; i<n; ){
        // 符合第一、二种字符
        if(bits[i]===1 && i+1<n){
            i+=2;
            continue;
        }else if(bits[i]===0){
            i+=1;
            continue;
        }
        // 否则返回
        else{
            return false
        }
    }

    return true
};


总结

实现方式其实有很多,这里仅供参考~

由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹