LeetCode___717. 1比特与2比特字符

有两种特殊字符。第一种字符可以用一比特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;
	    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值