zoukankan      html  css  js  c++  java
  • 1比特与2比特字符

    有两种特殊字符。第一种字符可以用一比特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的个数和1的个数相减大于1就能够确保0一定再后面。

    因为题目要求的组合方式一定是按给定的顺序排列的

    func isOneBitCharacter(bits []int) bool {
    	// 只要0的个数和1的个数相减大于1就可
    	zeroCount,oneCount := 0,0
    	for i:=0;i<len(bits);i++{
    		if bits[i] == 0 {
    			zeroCount++
    		}
    		if bits[i] == 1 {
    			oneCount++
    		}
    	}
    	if zeroCount - oneCount >=1 {
    		return true
    	}
    
    	return false
    }
    

    正确想法:按顺序遍历数组,遇到1的时候偏移量要跳两步,跳第一步的时候,要判断偏移量是否等于len(bits)-1,如果等于则最后剩下的值一定不是0,也就是不是一比特,如果不是继续跳一步。如果等于0,则直接在跳一步。

    func isOneBitCharacter(bits []int) bool {
    
    	x := 0
    	for x<len(bits){
    		if bits[x] ==0 {
    			x++
    		}else if bits[x] == 1{
    			x++
    			if x == len(bits)-1{
    				return false
    			}
    			x++
    		}
    	}
    
    	return true
    }
    
    

    比较进阶的算法,贪心算法

    三种字符分别为:0,01和11。那么bits数组中出现的所有0都表示一个字符的结束位置。因此最后一位是否为一比特字符,只和最后0和倒数第二个零之间1的个数有关。如果1的个数为偶数个,那么最后一位是一比特字符,如果不是就不是一比特字符。

    func isOneBitCharacter(bits []int) bool {
       oneCount := 0
    	for i:=len(bits)-2;i>=0;i--{
    		if bits[i]==1{
    			oneCount++
    		}else if bits[i] == 0 {
    			break
    		}
    	}
    	return oneCount%2==0
    
    }
    
  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 数的统计
    Java实现 蓝桥杯VIP 算法训练 和为T
    Java实现 蓝桥杯VIP 算法训练 友好数
    Java实现 蓝桥杯VIP 算法训练 连续正整数的和
    Java实现 蓝桥杯VIP 算法训练 寂寞的数
    Java实现 蓝桥杯VIP 算法训练 学做菜
    Java实现 蓝桥杯VIP 算法训练 暗恋
    Java实现 蓝桥杯VIP 算法训练 暗恋
    测试鼠标是否在窗口内,以及测试鼠标是否在窗口停留
    RichEdit 各个版本介绍
  • 原文地址:https://www.cnblogs.com/MyUniverse/p/14843234.html
Copyright © 2011-2022 走看看