LeetCode算法題-1-bit and 2-bit Characters(Java實現)

這是悅樂書的第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+篇,公衆號對話框回覆【數據結構與算法】、【算法】、【數據結構】中的任一關鍵詞,獲取系列文章合集。

以上就是全部內容,如果大家有什麼好的解法思路、建議或者其他問題,可以下方留言交流,點贊、留言、轉發就是對我最大的回報和支持!

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