2017-11-02 5 views
0

10進数を2進数に変換してから、 Integer.toBinary()など 私のプログラム:、事前に感謝、より最適であることができるかどうか、その後でない場合これは良いプログラミングの練習であるかどうか知りたいのですが、どうすればもっと最適で効率的なプログラムを書くことができますか?

public class Practise { 

static String decimalToBinary(int num) { 
    String binaryN = ""; 
    while (true) { 
     binaryN += num % 2; 
     num = num/2; 

     if (num == 1) { 
      binaryN += 1; 
      break; 
     } 
    } 
    String nBinary = ""; 
    for (int i = binaryN.length() - 1; i >= 0; i--) { 
     nBinary += binaryN.charAt(i); 
    } 
    System.out.println(nBinary); 
    return nBinary; 
} 

static int consecutiveOnes(String binaryN) { 
    int consecutive = 0; 
    int max = 0; 
    boolean isFreshStart = false; 
    for (int i = 0; i < binaryN.length(); i++) { 

     if (binaryN.charAt(i) == '1') { 
      if (isFreshStart) { 
       consecutive = 1; 
       isFreshStart = false; 
      } else 
       consecutive++; 

     } else { 
      isFreshStart = true; 

     } 
     if (consecutive > max) 
      max = consecutive; 
    } 
    return max; 
} 

public static void main(String[] args) { 
    Scanner in = new Scanner(System.in); 
    int n = in.nextInt(); 
    String binaryN = decimalToBinary(n); 
    System.out.println(consecutiveOnes(binaryN)); 
} 

} 

は私のプログラムの最適です。

+1

はOKですが、ループは 'num <= 0'のために終了しません – yacc

答えて

3

あなたの目標が連続する1をカウントする場合は、 は、バイナリ文字列に変換しないことをお勧めします。

あなたはビットシフトを使用してビットを反復処理することができる:

int work = num; 
while (work > 0) { 
    int bit = work & 1; 
    work >>= 1; 
    // Todo: count consecutive 1s 
} 

このアプローチは、はるかに少ないストレージ(代わりStringの本質的に単一のint)を使用し、そして追加の目的及び不要な中間体を作成することなく、はるかに高速に動作します型変換

+0

答えが得られてくれてありがとう、ありがとうございます。しかし、カウント1の方法が最適かどうかチェックできます。 –

+1

@Adibrajiwate私の意見はそうではありませんでした。最適ではありません。しかし、ビットを 'String'として扱う' continuousOnes'だけを見ると、そのメソッドの実装だけではパフォーマンスは良いですが、読みやすい、よりシンプルな方法で書くことができます:フラグ変数 'isFreshStart'を落とし、いくつかの条件を減らしてください。 – janos

関連する問題