这是我参与2022首次更文挑战的第28天,活动详情查看:2022首次更文挑战
今天是周日,本来都想小小休息了,但是至少底线不能丢,每日一题还是得刷起来
1比特与2比特字符
这道题出自力扣的717题 —— 1比特与2比特字符【简单题】
审题
有两种特殊字符:
第一种字符可以用一个比特 0 来表示
第二种字符可以用两个比特(10 或 11)来表示,给定一个以 0 结尾的二进制数组 bits ,如果最后一个字符必须是一位字符,则返回 true 。
- 根据题意,给出一个数组,数组内只存在1、0两种数,字符的类型只会有两种:0或者 10/11;
- 题意透露出,如果为true,则表示最后一位一定为0 = 一位字符
- 从左到右开始遍历数组,如果遇到0,则代表是第一种字符,下标+1;
- 如果遇到 1,则代表遇到第二种字符,无论下一位是 0还是 1,都是第二种字符,所以直接 +2
- 因此最后只需要判断,下标变量是否为 长度 -1(即是否为数组最后一位下标)
- 时间复杂度O(n),n是数组的长度,因为用了while
- 空间复杂度O(1),因为没有额外的空间开辟
编码
class Solution {
public boolean isOneBitCharacter(int[] bits) {
int start = 0;
while(start < bits.length -1){
if(bits[start] == 0)start++;
else start+=2;
}
return start == bits.length - 1;
}
}
彩蛋
本题还有一种解法,是官方题解的倒序遍历。简单概括解法就是,解设条件成立,则最后一位一定为0;找到bits数组的倒数第二位0的位置,那么 bits[i+1] 一定是一个字符的开头。可以通过 n−i 是否为偶数来判断最后一个字符是否为第一种字符,若为偶数则返回 true,否则返回 false。
class Solution {
public boolean isOneBitCharacter(int[] bits) {
int n = bits.length, i = n - 2;
while (i >= 0 && bits[i] == 1) {
--i;
}
return (n - i) % 2 == 0;
}
}