有两种特殊字符。第一种字符可以用一比特0
来表示。第二种字符可以用两比特(10
或 11
)来表示。
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
示例 1:
输入:
bits = [1, 0, 0]
输出: True
解释:
唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。
示例 2:
输入:
bits = [1, 1, 1, 0]
输出: False
解释:
唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。
===========================================================================================
思路一:将数组中的数依次放到map中,然后将10或11改为false存到另一个map2中,将单个的0改为true存到map2中,判断map2最后一个是不是true即可。代码:
public static void main(String[] args) {
int[] bits = {1,1,1,0};
System.out.println(isOneBitCharacter(bits));
}
public static boolean isOneBitCharacter(int[] bits) {
//首先判断数组中数据个数等于1个的情况
if(bits.length == 1){
if(bits[0] == 0){
return true;
}else{
return false;
}
}
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Map<Integer, Boolean> map2 = new HashMap<Integer, Boolean>();
//首先将数组的数据存到第一个map中
for(int i = 0;i < bits.length;i++){
map.put(i, bits[i]);
}
//System.out.println(map);
//遍历map如果相连的两个数是11或10就将值改为false并存到map2中
//如果是单个的0就存true到map2中
for(int j = 1;j <= map.size();j++){
if((map.get(j - 1) == 1 && map.get(j) == 0)
|| (map.get(j - 1) == 1 && map.get(j) == 1) ){
map2.put(j -1, false);
map2.put(j, false);
j++;
}else if(map.get(j - 1) == 0){
map2.put(j - 1, true);
}
}
//System.out.println(map2);
//最后输出map2的最后一个值
return map2.get(map2.size() - 1);
}
思路二:最后一个是不是单独的0,与0前面1连续的个数有关,如果只有一个1,那就只能是最后两位组成10,前面有两个1,最后三位就是110,(题目中给出,给定的字符串总是由0结束。),代码:
public static void main(String[] args) {
int[] bits = {1,1,1,1,0};
System.out.println(isOneBitCharacter(bits));
}
public static boolean isOneBitCharacter(int[] bits) {
int sum = 0; //用来定义连续1的个数
for(int i = bits.length - 2;i >= 0;i--){
/*
* 如果是1就加1,不是就直接停止for循环
*/
if(bits[i] == 1){
sum++;
}else{
break;
}
}
return sum%2==0;
}