717. 1-bit and 2-bit Characters。

We have two special characters. The first character can be represented by one bit 0. The second character can be represented by two bits (10 or 11).

Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero.

Example 1:

Input:
bits = [1, 0, 0]
Output: True
Explanation:
The only way to decode it is two-bit character and one-bit character. So the last character is one-bit character.

Example 2:

Input:
bits = [1, 1, 1, 0]
Output: False
Explanation:
The only way to decode it is two-bit character and two-bit character. So the last character is NOT one-bit character.

Note:

  • 1 <= len(bits) <= 1000.
  • bits[i] is always 0 or 1.

有两种特殊的字符,第一中字符用0来代替,另一种用10或者11代替,给定一个数组,这个数组最后一个元素肯定是0,我们需要判断最后这个0元素可不可以是属于第一种字符的,也就是这个最后的0可以是单独存在的而不依靠前面的元素。必须确保数组中的的所有元素都能够成功的组合成字符(无论是第一种还是第二种)。

那么我们就得到了限定条件:在确保数组中的元素都能够组合成字符之后,来判断最后一个0是否可以是第一种元素(也就是单独存在)。

可以发现第二种字符也就是10或者11,那么我们遍历一遍数组,如果当前元素是1就向后跳两个(因为两个元素组合起来代表一个第二种字符),如果是0就像后跳一个(因为一个字符就能够代表一个第一种字符)。

这样就相当于在确保前面的字符都能够成功的组合成字符之后,来判断最后一个字符是否能够单独存在。而判断的条件就是遍历一遍数组之后此刻的下标是不是等于最后一个下标,等于就说明此刻能够单独组成第一种字符,否则则不能。

比如:bits = [1,0,0,1,0,1,1,0,1,0](随便写的)

从前往后遍历:

发现第一个元素是1,说明此刻是属于第二种字符,那么我们就需要用两个元素来组成一个字符,

此刻如果用()来括起来字符的话,那么数组就是:[(1,0),0,1,0,1,1,0,1,0]。

再次遍历,因为此刻是0,0是可以单独组成第一种字符的,数组:[(1,0),(0),1,0,1,1,0,1,0]。

再次遍历,发现是1,同样的需要用两个元素来表示第二种字符,所以数组为:[(1,0),(0),(1,0),1,1,0,1,0]。

再次遍历,发现是1,同样的需要用两个元素来表示第二种字符,所以数组为:[(1,0),(0),(1,0),(1,1),0,1,0]。

再次遍历,发现是0,0是可以单独组成第一种字符的,所以数组为:[(1,0),(0),(1,0),(1,1),(0),1,0]。

再次遍历,发现是1,同样的需要用两个元素来表示第二种字符,所以数组为:[(1,0),(0),(1,0),(1,1),(0),(1,0)]。

这样遍历完成之后就把数组还原成了6个字符,而且发现最后一个0必须依靠前面的1才能行,否则这个数组就不合法了。


class Solution {
public:
    bool isOneBitCharacter(vector<int>& bits) {
        int num = 0;
        while(num < bits.size() - 1) {
            if(bits[num] == 1) {//如果遇到两个字符的就加2
                num = num + 2;
            } else {//否则加一
                num++;
            }
        }
        if(num == bits.size() - 1) {//如果此时正好等于最后一个下标的位置,说明最后一个就是0
            return true;
        }
        return false;
    }
}; 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值