tags:
- 简单
- 完成
- 数组
flag: green
style: summer
date: ‘2019-6-29’
717.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.
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/1-bit-and-2-bit-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、解答
- 大佬的解法:
遍历数组,是1的话就跳过下一个,是零的话就不跳过下一个,继续遍历.最后是1或者没有了,就是false,否则是true.
class Solution {
public boolean isOneBitCharacter(int[] bits) {
int i;
for (i = 0; i < bits.length - 1; i++) {
if (bits[i] == 1)
i++;
}
if (i >= bits.length || bits[i] == 1)
return false;
return true;
}
}
- 最强大佬
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;
}
时间消耗 1ms, 在所有Java提交中击败了99.74%的用户
内存消耗 :35.5 MB, 在所有Java提交中击败了92.40%的用户
- 自我解答:
class Solution {
public boolean isOneBitCharacter(int[] bits) {
int length = bits.length;
//长度为1,因为最后一位必定为0,结果为true
if (length == 1) {
return true;
}
//长度为2,看第一位为0 or 1,为0则为true,反之为false;
if (length == 2) {
if (bits[0] == 0) {
return true;
}else{
return false;
}
}
//长度为3,第一位为1,结果为true,第一位为0则看第二位,
//第二位为1,结果为false;
if (length == 3) {
if (bits[0] == 1) {
return true;
}else if(bits[1] == 1){
return false;
}else{
return true;
}
}
//当某位值为0时候,i++;
//当某位值为1时候,i += 2;
for (int i = 0; i < length - 1; i++ ) {
if (bits[i] == 0) {
//当倒数第二位为0的时候
if (i == length - 2) {
return true;
//当倒数第三位为0的时候
}else if (i == length - 3) {
//且当倒数第二位为0的时候
if(bits[i + 1] == 0){
return true; //返回 true;
}else{
//且当倒数第二位为1的时候
return false;
}
}
}else{//到b[i]为1的时候
//当倒数第二位为1的时候
if (i == length - 2) {
return false; //返回false;
//当倒数第三位为1的话
}else if (i == length - 3) {
return true; //返回 true;
}
i++; //当bits[i] = 1时候,跳两个
}
}
return false;
}
}
复杂度分析:
执行用时 :1 ms, 在所有 Java 提交中击败了99.70%的用户
内存消耗 :37.1 MB, 在所有 Java 提交中击败了83.04%的用户