力扣 第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的測試方法來測試的代碼二,導致出現的這個異常。當將代碼大幅度更改之後,剛好刷新了緩存,所以就透過過了

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