**
973. 1位跟2位字符
**
*
题目:
**
我们有两个特殊的字符。第一个字符可以用一位 0 来表示。第二个字符可以用两位(10 或者 11)表示。
现在给出一个字符串表示若干位。返回最后一个字符是否必定为一位字符。给出的字符串总是以 0 结尾。
样例
样例 1:
输入:
bits = [1, 0, 0]
输出: True
解释:
解码它的唯一方法是两位字符和一位字符。所以最后一个字符是一位字符。
样例 2:
输入:
bits = [1, 1, 1, 0]
输出: False
解释:
解码它的唯一方法是两位字符和两位字符。所以最后一个字符不是一位字符。
注意事项
1.1 <= len(bits) <= 1000.
2.bits[i] 总是 0 or 1.
思路:
1.首先看到这个题目的时候我想到的是哈夫曼编码,但是仔细想想这只是需要我们验证一下而已,应该不需要这么做;
**2.如果我最后一位给的是1,那么我们可以肯定的结果肯定是false;
3.接着最后一位是0的时候才需要进一步考虑更多。如果所给的数组大小为length,那么除掉最后一位0,也就是还有length-1位,如果这length-1位刚好按照这个规则编码完,那么就输出true,否则输出false;
4.那怎么解读这个规则呢?其实很简单,从第一位开始,如果遇到0,直接下一位,如果是1,那就跳一位,到下下位。一直这么下去,那什么时候跳出这个循环呢???
条件应该是前length-1为,也就是下标到length-2;如果下标比length-2大或者等于length-2的时候跳出循环;那么问题来了,跳出循环的时候,我们的下标有两种可能性。第一是刚好前面length-1个刚好编码,下标等于length-1。第二就是不能刚好编码,按照我刚刚的循环规则,此时的下标不等于length-1。
总的思路就是这样子。下面附上我自己写的代码,虽然不是很好,但作为小白来说也不苛求速度了。在这里插入代码片
bool isOneBitCharacter(vector<int> &bits) {
int length=bits.size();
int i=0;
if(bits[length-1]==0)
{
for(i=0;i<length-1;)
if(bits[i]==0) i++;
else {
i++;
i++;
}
if(i==length-1) return true;
else return false;
}
}