1. 程式人生 > >(java)leetcode717 1位元與2位元字元 即根據不同的長度對字元進行解碼(1-bit and 2-bit Characters)

(java)leetcode717 1位元與2位元字元 即根據不同的長度對字元進行解碼(1-bit and 2-bit Characters)

題目描述:

有兩種特殊字元。第一種字元可以用一位元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.

解題思路:

本題的解決辦法就是按順序解析陣列,如果第一個數字為1,則陣列下標後移兩位,如果第一個數字為0,陣列下標後移一位,根據解碼的規則而來。依次解碼陣列中的所有資料,陣列下標每後移一次,我們判斷一下陣列下標是否剛好是最後一位,如果是,因為最後一位剛好是0.所以返回true,否則返回false。

程式碼實現:

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
        boolean flag=false;
        
        for(int i=0;i<bits.length;){
            if(i==bits.length-1)
                flag=true;
            
            if(bits[i]==0){
                i++;
            }
                
            else{
                 i=i+2;
            }
              
        }
        
        return flag;
    }
}

補充:

上面的程式碼中,每次迴圈都要執行一次判斷,仔細觀察發現,最終得出程式結果應該是倒數第二次迴圈時,所以我們改進了程式碼,減少一次迴圈,但是解題思路不變。

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
        int i = 0;
        while (i < bits.length - 1) {
            i += bits[i] + 1;
        }
        return i == bits.length - 1;
    }
}

本人才疏學淺,文中若有錯誤或有更好的方法,歡迎在評論中指出,共同進步。