717. 1比特与2比特字符

题目:
有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。

换句话说就是字符串的最后一位是0,因为考虑到最后一位是1肯定不可能最后一个字符是否必定为一个一比特字符。

示例 1:

输入: bits = [1, 0, 0]
输出: True
解释: 唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。

示例 2:

输入: bits = [1, 1, 1, 0]
输出: False
解释: 唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。

思路:

1、从数组第一位开始遍历,i=0,循环终止条件(i<lengtn-1)
2、如果值为1,则肯定是二比特,i=i+2
3、如果值为0,则肯定是一比特(因为0开头的肯定是一比特),i++

为啥到lengtn-1呢,就是想看倒数第二个数字是一比特还是二比特,如果是一比特,i=length-1;但如果是二比特,在经历i=i+2之后,i应该是等于index

class Solution {
public:
    bool isOneBitCharacter(vector<int>& bits) {
        int length = bits.size();
        int i = 0;
        while (i<length-1) {
            if (bits[i] == 0) {
                i++;
            } else {
                i = i+2;
            }
        }
        if (i!=length) {
            return true;
        } else {
            return false;
        }     
    }
};

当然,想写简洁点省几行代码可以这样

bool isOneBitCharacter(vector<int>& bits){
    int last = -1;
    for (int i = 0; i < bits.size(); i++) {
        if (bits[i] == 1) ++i;
        else last = i;  //last记录的是最后一个没有被跳过的0的下标位置
    }
    return last == bits.size()-1;  //最后一个没有被跳过的0的下标位置是最后一个,那么ture,否则false
}

或者这样

bool isOneBitCharacter(vector<int>& bits){
    for (int i = 0; i < bits.size(); ++i) {
        if (i == bits.size()-1) return true;  //如果倒数第一个没被跳过,就是true,因为题目说了字符串最后一个一定是0
        if (bits[i]) ++i;        //是1就在循环里+1,含义是跳过下一个字符,因为1开头的一定是两比特
    }
    return false;  //如果倒数第一个被跳过,就是false,被跳过说明倒数第二个没被跳过而且是1
}
posted on 2021-05-11 21:26  雾恋过往  阅读(81)  评论(0编辑  收藏  举报

Live2D