力扣 第717题1比特与2比特字符

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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

我的答案

思路:
当倒数第二个bits数为0,则最后一个数必定为0,所以返回true;
当倒数第二个bits数为1,则统计前面有多少个连续的1,
如果是单数个,则代表bits数组中最后两个bits数是一组的(10或者11),返回false;
如果是偶数个,则代表bits数组中最后一个bits数是0,且不跟倒数第二个bits数一组,返回true。

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
    	//bits数组长度为0时,返回false
        if(bits.length == 0){
            return false;
        }
        //bits数组长度为1时,且值为0,返回true,否则返回false
        if (bits.length == 1 && bits[0] == 0) {
            return true;
        }else if(bits.length == 1){
            return false;
        }
        //i代表的是bits数组的倒数第二个值的下标
        int i = bits.length - 2;
        //当倒数第二个数为0时,最后一个数肯定是0,返回true
        if (bits [i] == 0){
            return true;
        }else {
        	//j代表连续1的个数
            int j = 0;
            //统计前面有多少个连续的1
            for (; i >= 0; i--) {
                if (bits [i] == 1){
                    j++;
                }else {
                    break;
                }
            }
            //比较连续1的个数,如果是偶数个,则返回true,如果是奇数个,则返回false
            if(j % 2 == 0) {
                return true;
            }
            return false;
        }
    }
}

测试代码结果正确并可提交

在这里插入图片描述

我的答案2

思路:
遍历一遍数组内容,遇到1则前进两步(因为1开头一定是包含两个比特的),遇到0则前进一步。
遇到1则令结果变量为false,遇到0则令结果变量为true。
当遍历完时
如果最后走的一步恰好为遇到1时,则返回为false,
如果最后走的一步是遇到0时,则返回为true。

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
    	//从头开始遍历数组
        for (int i = 0; i < bits.length;) {
        	//如果下标所对应的值为1
            if (bits [i] == 1){
            	//则后跳两步
                i += 2;
                //如果长度大于等于数组的长度,则代表已经全部遍历完毕了,代表最后一组为双字符,返回false
                if(i >= bits.length){
                    return false;
                }
            }else {
            	//如果下标对应的值不为1,那么就是0,则后跳一步
                i++;
                //如果长度大于等于数组长度,则代表已经遍历完毕,代表最后一组值为单字符,返回true
                if(i >= bits.length){
                    return true;
                }
            }
        }
        return false;
    }
}

测试代码结果正确并可提交

在这里插入图片描述

中间遇到的问题

当在本地完成代码,在本地测试正确后,想放到力扣上测试并提交,结果报了个编译时异常

Line 10: error: cannot find symbol [in __Driver__.java]
      int ret = new Solution().isOneBitCharacter(param_1);
                              ^
  symbol:   method calculate(int)
  location: class Solution

在网上查找一番答案之后,还是没有正确,于是试着把答案一中的最开始的过滤代码写了上去。

//bits数组长度为0时,返回false
if(bits.length == 0){
    return false;
}
//bits数组长度为1时,且值为0,返回true,否则返回false
if (bits.length == 1 && bits[0] == 0) {
    return true;
}else if(bits.length == 1){
    return false;
}

然后,编译就通过了,这个问题卡了一天,最后居然就这样就成功了。个人猜测是缓存卡住了,一直用的测试代码1的测试方法来测试的代码二,导致出现的这个异常。当将代码大幅度更改之后,刚好刷新了缓存,所以就透过过了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章