2016-09-27 3 views
0

이 코드의 작동 방식을 이해할 수 없습니다. 문제는 다음 해에 고유 한 숫자가있는 연도가 발견됩니다.이 부울 배열은 어떻게 작동합니까?

public Main(){ 
    try{ 
     BufferedReader in; 
     in = new BufferedReader (new InputStreamReader (System.in)); //Used for CCC 
     String year = (in.readLine()); 
     for(int i = Integer.parseInt(year)+1;; i++){ 
      String f = Integer.toString(i); 
      boolean [] characters = new boolean[10]; 
      boolean unique = true; 
      for(int x = 0; x < f.length(); x++){ 
       if (characters[f.charAt(x) - '0']){ 
        unique = false; 
        break; 
       } 
       else{ 
        characters[f.charAt(x)-'0'] = true; 
       } 
      } 
      if (unique){ 
       System.out.println(f); 
       return; 
      } 

특히 if 문은 어떻게 작동합니까?

if (characters[f.charAt(x) - '0']){ 

여기서 부울 검사는 무엇입니까? 그들은 모두 거짓으로 디폴트되어서는 안됩니까? 그리고 왜 거기에 '0'이 있습니까? 멍청한 질문에 대해 유감입니다.

+5

중단 점을 설정하거나 코드를 디버그하여 직접 이해하려고 시도 했습니까? –

+0

'모두 기본값이 false가 아니어야합니까? '- 가능 합니다만,''문자 [x]''['.charAt (x) -'0 ']' –

+0

@ cricket_007 나는 시도했다. 그러나 자바에서 꽤 초보자이다. 그래서 나는 디버거를 사용하는 법을 알지 못한다. 나는 그것에 대해 비디오를 볼 것이다. 제안에 감사한다. –

답변

1

발현

f.charAt(x) - '0' 

문자열 f에 위치 x의 자리에 따라 0과 9 사이의 번호를 반환한다. 따라서 코드는 배열의 10 자리 위치 각각에 부울 플래그를 설정하고 숫자가 두 번 이상 나타나는 경우 false를보고 내부 루프에서 빠져 나와 다음 해를 고려합니다.

+0

부울 플래그 란 무엇인가? 내가 봤어하지만 난 단지 거짓 또는 사실로 부울 설정하는 말할 수 없다? –

+0

@ I.Lav 네, 발생하는 각 숫자에 대해'characters' 배열에'true'를 설정하는 것입니다. 이미 본 번호를 발견하면 그 해를 거부합니다. –

0

characters은 10 개의 요소로 구성된 부울 배열이며 주어진 입력 문자 (소수점 이하 자릿수로 제한되어야 함)가 입력에 두 번 이상 표시되는지 여부를 저장합니다.

숫자의 문자 코드는 0x30 - 0x39 범위에 있습니다. f.charAt(x)은 입력의 인덱스 x에있는 문자를 반환 한 다음 - '0'을 부울 배열에 대한 인덱스 인 0-9 범위의 숫자로 변환합니다.

문자를 처음 발견하면 해당 슬롯은 true으로 설정됩니다. 다시 찾으면 입력이 중복 문자임을 나타 내기 위해 uniquefalse으로 설정됩니다.

관련 문제