首页 > 其他 > 详细

1-bit and 2-bit Characters LT717

时间:2019-05-09 10:46:07      阅读:123      评论:0      收藏:0      [点我收藏+]

We have two special characters. The first character can be represented by one bit 0. The second character can be represented by two bits (10 or 11).

Now given a string represented by several bits. Return whether the last character must be a one-bit character or not. The given string will always end with a zero.

Example 1:

Input: 
bits = [1, 0, 0]
Output: True
Explanation: 
The only way to decode it is two-bit character and one-bit character. So the last character is one-bit character.

 

Example 2:

Input: 
bits = [1, 1, 1, 0]
Output: False
Explanation: 
The only way to decode it is two-bit character and two-bit character. So the last character is NOT one-bit character.

Note:

  • 1 <= len(bits) <= 1000.
  • bits[i] is always 0 or 1.

 

Idea 1. dynamic programming, let dp[i] represents whether the encoded character could be ended here, 

dp[i] = (A[i] == 0) || !dp[i-1]

Time complexity: O(n)

Space complexity: O(n)

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
        int N = bits.length;
        boolean[] dp = new boolean[N];
        dp[0] = true;
        for(int i = 1; i < N; ++i) {
            dp[i] = (bits[i-1] == 0 || !dp[i-1]);
        }
        
        return dp[N-1];        
    }
}

reduce it to 1-D dynamic programming

dp = (bits[i-1] == 0 || !dp)

Time complexity: O(n)

Space complexity: O(1)

class Solution {
    public boolean isOneBitCharacter(int[] bits) {
        int N = bits.length;
        boolean dp = true;
     
        for(int i = 1; i < N; ++i) {
            dp = (bits[i-1] == 0 || !dp);
        }
        
        return dp;        
    }
}

Idea 2. Climbing stairs, if we can end in N-1 stairs, the Nth stair would be one character,

step += 1 if A[i] = 0

step += 2 ifA[i] = 1;

 1 class Solution {
 2     public boolean isOneBitCharacter(int[] bits) {
 3         int N = bits.length;
 4         int step = 0;
 5      
 6         for(int i = 0; i < N-1; ++i) {
 7             if(bits[i] == 0) {
 8                 step +=1;
 9             }
10             else {
11                 step += 2;
12                 i+=1;
13             }
14         }
15         
16         return step == N-1;        
17     }
18 }

better code

 1 class Solution {
 2     public boolean isOneBitCharacter(int[] bits) {
 3         int N = bits.length;
 4         int pos = 0;
 5      
 6         while (pos < N-1) {
 7             if(bits[pos] == 0) {
 8                 pos +=1;
 9             }
10             else {
11                 pos += 2;
12             }
13         }
14         
15         return pos == N-1;        
16     }
17 }

Idea 3. If you observe the pattern closely, only the last ones decide whether the last character must be 1-bit character or not, if odd number of ones, we need the last character to pair with the last one, if the number of ones is even, the last character can be 1-bit.

Time complexity: O(n)

Space complexity: O(1)

 1 class Solution {
 2     public boolean isOneBitCharacter(int[] bits) {
 3         int N = bits.length;
 4         int lastOnes = 0;
 5      
 6         for(int i = N-2; i >= 0 && bits[i] != 0; --i) {
 7             ++lastOnes;
 8         }
 9         
10         return ((lastOnes & 1) == 0);        
11     }
12 }

 

1-bit and 2-bit Characters LT717

原文:https://www.cnblogs.com/taste-it-own-it-love-it/p/10836377.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!