此博客链接:https://www.cnblogs.com/ping2yingshi/p/14286560.html
1比特与2比特字符
题目链接:https://leetcode-cn.com/problems/1-bit-and-2-bit-characters/
题目
有两种特殊字符。第一种字符可以用一比特0来表示。第二种字符可以用两比特(10 或 11)来表示。
现给一个由若干比特组成的字符串。问最后一个字符是否必定为一个一比特字符。给定的字符串总是由0结束。
示例 1:
输入:
bits = [1, 0, 0]
输出: True
解释:
唯一的编码方式是一个两比特字符和一个一比特字符。所以最后一个字符是一比特字符。
示例 2:
输入:
bits = [1, 1, 1, 0]
输出: False
解释:
唯一的编码方式是两比特字符和两比特字符。所以最后一个字符不是一比特字符。
题解
此题的字符只有两种,第一种是一个字符只含有一个比特,第二种是一个字符含有两个比特,而且这两个比特只能由10或者11表示。所以这题先判断给定的数组的长度是奇数还是偶数,只有是奇数,并且前面的字符都是满足10或者11组合的数组,才能输出true。
代码
错误代码
class Solution { public boolean isOneBitCharacter(int[] bits) { if(bits.length%2==0) { return false; } else{ for(int i=0;i<bits.length-1;i=i+2) { if(bits[i]!=1) return false; } } return true; } }
我好像理解错题意了,这好像不需要只是最后是一个比特,可以都是一个比特组成,问题出在,如果前面有1的话,只能由两个比特组成,如果前面是0,可以由但是0组成。
正确代码
思路
先判断最后一位是否为1,如果是1,则返回false,然后从头开始遍历数组,如果遇到数组元素等于1,则接着遍历后两个元素,如果元素等于0,则遍历后一个元素,直到遍历到数组的最后,如果i的值等于数组长度减一,则说明数组最后一次遍历的是0,返回true,如果i的值不能与数组减一,则说明数组最后一次遍历的是1,则返回false.
class Solution { public boolean isOneBitCharacter(int[] bits) { if(bits[bits.length-1]==1) { return false; } int i=0; for(i=0;i<bits.length-1;) { if(bits[i]==1) i=i+2; else i++; } if(i!=bits.length-1) return false; return true; } }
结果