这个题一看就明白,写的时候又不明白了,思考了好一会才想通。。。
cpp
class Solution {
public:
bool isOneBitCharacter(vector<int>& bits) {
int n = bits.size();
int i = 0;
// 遍历到倒数第二个元素为止(最后一个元素单独判断)
while (i < n - 1) {
// 遇到1,跳2位(2比特字符);遇到0,跳1位(1比特字符)
i += (bits[i] == 1) ? 2 : 1;
}
// 若i最后等于n-1,说明最后一个元素是单独的比特字符
return i == n - 1;
}
};
一、题目里的 "特殊字符规则"
有两种字符,解码规则是:
- 1 比特字符 :只能用
0表示(占数组里的 1 个位置)。 - 2 比特字符 :只能用
10或11表示(占数组里的 2 个连续位置)。
二、题目的要求
给你一个以 0 结尾 的二进制数组 bits,需要判断:把这个数组按照上面的规则 "完整解码" 后,最后一个被解码出来的字符,是不是 1 比特字符。
三、用示例理解
示例 1:输入 bits = [1,0,0]
解码过程只能是:
- 第 1 个元素是
1→ 必须和第 2 个元素组成 "2 比特字符"(10)。 - 剩下的第 3 个元素是
0→ 单独组成 "1 比特字符"。
所以最后一个字符是 1 比特字符,输出 true。
示例 2:输入 bits = [1,1,1,0]
解码过程只能是:
- 第 1 个元素是
1→ 和第 2 个元素组成 "2 比特字符"(11)。 - 第 3 个元素是
1→ 和第 4 个元素组成 "2 比特字符"(10)。
所以最后一个字符是 2 比特字符,输出 false。
四、核心逻辑
因为数组是 "必须完整解码" 的,所以解码过程是从左到右、强制匹配规则的:
- 遇到
1→ 必须 "吃掉" 当前和下一个元素(组成 2 比特字符)。 - 遇到
0→ 只能 "吃掉" 当前元素(组成 1 比特字符)。