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