2017-11-02 8 views
0

10 진수를 2 진수로 변환하는 프로그램을 작성한 후 다음과 같은 기능을 사용하지 않고 연속 1을 찾습니다. 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

괜찮아 보이지만, 루프는'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

@Adibrajiwate 내 요점은 아니었다. 최적이 아니다. 그러나 비트를'String'으로 취하는'continuousOnes' 만 보았을 때, 그 메소드의 구현만으로도 성능면에서는 좋지만, 더 쉬운 방법으로 쉽게 읽을 수 있습니다 : 플래그 변수'isFreshStart'을 삭제하고 조건의 일부를 줄이십시오. – janos