這是悅樂書的第302次更新,第321篇原創
01 看題和準備
今天介紹的是LeetCode算法題中Easy級別的第170題(順位題號是717)。有兩個特殊字符,第一個字符可以用一個比特0表示,第二個字符可以用兩個比特(10或11)表示。現在給出一個由比特位組成的數組,判斷其最後一個字符是否是一位字符。數組的最後一位始終是比特0。例如:
輸入:bits = [1,0,0]
輸出:true
說明:解碼它的唯一方法是兩位字符和一位字符,所以最後一個字符是一位字符。
輸入:bits = [1,1,1,0]
輸出:false
說明:解碼它的唯一方法是兩位字符和兩位字符,所以最後一個字符不是一位字符。
注意:
數組長度範圍爲[1,1000]。
bits[i]始終爲0或1。
本次解題使用的開發工具是eclipse,jdk使用的版本是1.8,環境是win7 64位系統,使用Java語言編寫和測試。
02 第一種解法
爲了滿足最後一位是0,前面的n-1位必須完成匹配,即前面的n-1位能夠按照一位、兩位合理組成。所以,我們直接使用循環,計算前面n-1位完成組合的長度,判斷其是否等於n-1。因爲有兩種情況,遇到0的時候,一位就行,遇到1的時候,只能是兩位。使用一個變量,從0開始往後累加,遇到0就加1,遇到1就加2,最後判斷其是否等於n-1。
public boolean isOneBitharacter(int[] bits) {
int len = bits.length, index = 0;
while (index < len-1) {
if (bits[index] == 0) {
index++;
} else {
index += 2;
}
}
return index == len-1;
}
03 第二種解法
對於第一種解法,我們還可以再優化下,在循環中去掉if判斷,直接加上當前元素,因爲後面帶了加1,遇到0還是加1,遇到1,就變成加2了,和原來的思路一樣。
public boolean isOneBitharacter2(int[] bits) {
int len = bits.length, index = 0;
while (index < len-1) {
index += bits[index] + 1;
}
return index == len-1;
}
04 第三種解法
我們也可以從後往前推導。因爲數組最後一個數字始終是0,在遇到倒數第二個0時,這中間1的個數只能是偶數個或者0個。如果中間1的個數是0個,即數組最後兩個元素都是0,不管其前面是1還是0,都滿足條件。其二,如果中間1的個數是奇數個,並且是連着的,就不滿足題目的設定了。
public boolean isOneBitharacter3(int[] bits) {
int len = bits.length;
int count = 0;
for (int i = len - 2; i >= 0; i--) {
if (bits[i] == 1) {
count++;
} else {
break;
}
}
return count%2 == 0;
}
05 小結
算法專題目前已日更超過五個月,算法題文章170+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。
以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!