「这是我参与2022首次更文挑战的第22天,活动详情查看:2022首次更文挑战」
编程世界总是离不了算法
最近在看框架源码时,会有很多算法的实现逻辑,有时候会感到吃力
于是决定蹭着假期,加强算法和数据结构相关的知识
那怎么提升呢?
其实我知道算法这东西没有捷径,多写多练才能提升,于是我开启我的LeetCode刷题之旅
第一阶段目标是:200道,每天1到2篇
为了不乱,本系列文章目录分为三部分:
- 今日题目:xxx
- 我的思路
- 代码实现
今天题目: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
};
总结
实现方式其实有很多,这里仅供参考~
由于刚开始刷题,也不知道从哪里刷好,如果前辈们有好的建议,希望不吝赐教,感谢🌹