题目描述
有两种特殊字符。第一种字符可以用一比特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.
算法思想
由题目容易看出:0总是字符的结尾,可以由此作为切入点。
已知bits数组的最后一个元素为0,从后向前遍历bits数组,遇到倒数第二个0时停止。(之所以遇到倒数第二个0停止,是因为这个0必为一个字符的结尾,不可能是字符的开始,因此它及它之前的元素都没必要考虑,不影响结果了~)检查两个0之间1的个数,若为奇数个,则最后一个0总和它前面相邻的那个1配对,因此最后一个0不是单字符0,返回false;若为偶数个,则那偶数个1总可以两两完成配对,最后一个0一定是单字符0,返回true。
加入bits中仅有一个0,即末尾的这个0,那么判断其前方1的个数就可以了,条件同上。
代码
package pid717;
public class Solution {
public boolean isOneBitCharacter(int[] bits){
int i = bits.length - 2;
int count = 0;//计算两个0之间1的个数
for(;i>=0;i--){
if(bits[i] == 0){
if(count % 2 == 1){
return false;
}else{
return true;
}
}else{
count++;
}
}
// 数组中只有一个0的情况
if(count % 2 == 1){
return false;
}else{
return true;
}
}
public static void main(String[] args) {
Solution sol = new Solution();
int[] bits = {1,1,1,0};
boolean res = sol.isOneBitCharacter(bits);
System.out.println(res);
}
}