题目
有两种特殊字符:
- 第一种字符可以用一个比特
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
解法思路:
首先想到采用栈,将前一个单元压入栈中,然后通过栈顶元素和当前单元进行比较。如果是10/11的组合,则出栈;如果是0则入栈。这种思路的问题在于如果示例是[0,0]的情况,也就是多个1比特的情况会出错;因此最终的伪代码如下:
遍历列表:
如果栈不为空:
如果栈顶为1(此时无论当前列表单元为1或0,都可以匹配):
栈POP
否则栈顶为0时(此时保证在多个0的时候也可以生效,因此需要保证栈内只有一个元素,基于这种思想引出下面精简版)
栈POP
再将当前单元PUSH入栈
判断栈顶为1或者栈空:Flase;若栈顶为0:True.
初版
代码如下:
stack<int> s;
bool isOneBitCharacter(vector<int>& bits) {
for(int i = 0;i < bits.size();i++){
if(!s.empty()){
if(s.top() == 1){
s.pop();
}else{
s.pop();
//if(bits[i] == 1)
// return false;
//else
s.push(bits[i]);
}
}else{
s.push(bits[i]);
}
}
if(s.empty()){
return false;
}else{
if(s.top() == 0){
return true;
}else{
return false;
}
}
结果如下:
精简版
但由于上面的伪代码中可以看出,实际操作中并不需要栈,而只需要一个int来代表列表中上一个比特的值,用-1为空,代码如下:
bool isOneBitCharacter(vector<int>& bits) {
int s=-1;
for(int i=0;i<bits.size();i++){
if(s==1){
s=-1;
}else if(s==0){
if(bits[i]==1)
s=1;
}else if(s==-1){
s=bits[i];
}
}
if(s==0)
return true;
else
return false;
}
结果如下: