「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」
前言
今日的题目为简单题,只需要简单的模拟遍历就能够完成题目,并且还提供了另一种从尾部遍历的数学解法,在特定情况下不需要遍历完整个数组。
每日一题
今天的每日一题 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 or 1
题解
简单模拟
这道题最简单的解法就是直接遍历整个数组,因为我们会碰到两种情况:
-
以 0 为开头,说明是一个比特 0 的情况,直接将答案改为true并且执行下一项
-
以 1 为开头,说明是两个比特的情况,将答案改为false并且设定一个标记,表示下一项需要跳过,然后执行下一项
在循环遍历完整个数组之后,就能够得到答案的值,这就是题目要求的最后一位的情况。
/**
* @param {number[]} bits
* @return {boolean}
*/
var isOneBitCharacter = function (bits) {
let ans = 0,
n = bits.length;
let isTwo = 0;
for (let i in bits) {
if (isTwo == 1) {
isTwo = 0;
continue;
}
if (bits[i] == 0) {
ans = 1;
continue;
}
if (bits[i] == 1) {
ans = 0;
isTwo = 1;
continue;
}
}
return ans;
};
复制代码
逆序解法
题目还有另外的一种思路,在特定情况下并不一定需要循环遍历完整个数组。
-
首先要满足题目的要求,那么最后一位必须得是 0
-
然后我们可以从尾部去向前遍历,直到找到第二个 0
-
接着只要去判断第二个0 之后的数组长度是奇数还是偶数,如果是奇数,那说明最后一位一定是 一比特 0 ,返回true,反之一定是 二比特 10 ,返回false。 可以看一下下图做一个理解。
/**
* @param {number[]} bits
* @return {boolean}
*/
var isOneBitCharacter = function (bits) {
let n = bits.length;
if (bits[n - 1] == 1) {
return false;
} else if (n == 1) {
return true;
} else {
let long = 1;
for (i = n - 2; i >= 0; i--) {
if (bits[i] == 0) {
if (long % 2 == 1) {
return true;
} else {
return false;
}
}
long = long + 1;
}
return n % 2;
}
};
复制代码