有两种特殊字符。第一种字符可以用一比特0
来表示。第二种字符可以用两比特(10
或 11
)来表示。
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
示例 1:
输入:
bits = [1, 0, 0]
输出: True
解释:
唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。
示例 2:
输入:
bits = [1, 1, 1, 0]
输出: False
解释:
唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。
注意:
1 <= len(bits) <= 1000
.bits[i]
总是0
或1
.
解析:
该题目不是简单的判断倒数两位是否有1,而是需要从头到尾进行判断。如果整个数组的长度为1,则返回true,否则,要遍历整个数组,如果i位置的值为1,则它必然与后一个数值共同组成一个2比特,此时下标移动两个位置;如果是0,则它自己组成一个1比特,此时下标移动一个位置。一直遍历到倒数第二位,如果索引i指到倒数第三位,并且倒数第三位为1,则此时i向后移动两位,到达倒数第一位,则此时必定是一个1比特字符。如果i直到倒数第二位,并且倒数第二位是1,则该数字必须和最后一个数字共同组成一个2比特字符。
代码:
bool isOneBitCharacter(vector<int>& bits)
{
int size = bits.size();
if (size == 1)
return true;
int i;
for (i = 0; i < size - 1; i++)
{
if (bits[i] == 1)//从头到尾的遍历,遍历到一个1,不管后边是0还是1,都要共同组成2比特字符
i++;
}
if (i == size - 1)//如果最终下标指向最后一个数字,则表示前边字符刚好组成相应比特,只剩一个0
return true;
else
return false;
}
他山之石:
//找倒数第二位开始的连续1的个数,如果是奇数返回false
bool isOneBitCharacter(vector<int>& bits)
{
int n = bits.size(), i = n - 2;
int cnt = 0;
while (i >= 0 && bits[i--] == 1)
++cnt;
if (cnt % 2) return false;
return true;
}