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
}