【動態規劃】求最大連續bit數

王世暉發表於2016-03-29

功能: 求一個byte數字對應的二進位制數字中1的最大連續數,例如3的二進位制為00000011,最大連續2個1
    
輸入: 一個byte型的數字
    
輸出: 無
     
返回: 對應的二進位制數字中1的最大連續數


輸入描述:

輸入一個byte數字



輸出描述:

輸出轉成二進位制之後連續1的個數


輸入例子:
3

輸出例子:
2


思路:
動態規劃:array[i]表示數字在bit i位置上的01數字
max[i]表示以bit i結尾的的最長連續1個數 */
max[i]=max[i-1]+1,array[i]=1
max[i]=0,array[i]=0
邊界條件:
max[0]=array[0]
max陣列中儲存了以每個bit位結尾的最大連續bit數
所求的最大連續bit數的連續bit必定是以某個bit位結尾的
因此max陣列中的最大值就是最大的連續bit數



import java.util.*;
public class Main {
    public static void main(String args[]){
        Scanner cin=new Scanner(System.in);
        while(cin.hasNext()){
            int m=cin.nextInt();
            /*動態規劃:array[i]表示數字在bit i位置上的01數字
            * max[i]表示以bit i結尾的的最長連續1個數 */
            /*  max[i]=max[i-1]+1,array[i]=1
             *  max[i]=0,array[i]=0
             *  邊界條件:
             *  max[0]=array[0]
             *  max陣列中儲存了以每個bit位結尾的最大連續bit
             *  所求的最大連續bit數的連續bit必定是以某個bit位結尾的
             *  因此max陣列中的最大值就是最大的連續bit*/
            /*將數字轉化為二進位制字串*/
            String s=Integer.toBinaryString(m);
            System.out.println(m+" to binary:"+s);
            /*將字串轉化為char陣列*/
            char[] array=s.toCharArray();
            /*狀態轉移表*/
            int[] max=new int[32];
            /*邊界條件*/
            max[0]=charToInt(array[0]);
            for(int i=1;i<array.length;i++){
                /*狀態轉移方程*/
                if(charToInt(array[i])==1){
                    max[i]=max[i-1]+1;
                }else{
                    max[i]=0;
                }

            }
            int result=0;
            /*max陣列遍歷一次找到最大值*/
            for(int i=0;i<max.length;i++){
                if(max[i]>result){
                    result=max[i];
                }
            }
            System.out.println(result);
        }
    }
    public static int charToInt(char c){
        if(c=='1')return 1;
        else return 0;
    }
}


測試用例:



相關文章