2013-02-05 2 views
0

안녕하세요 저는 Facebook 해커 경연 대회에 참가했으며이 질문에 대한 해결책을 얻었습니다. 나는 O (K^2)의 순서로 문제를 풀었지만이 사람은 O (^ K)에서 그것을 풀었다. 코드가하는 일을 설명해주세요.map [(int) x] ++는 무엇입니까?

import java.io.File; 
    import java.util.Scanner; 

    public class FindTheMin { 

private long getNextMin(long[] map, long start, long k) { 
    while (map[(int)(start)] > 0) 
     start++; 
    return start; 
} 

public long findNth(long n, long k, long a, long b, long c, long r) { 
    long[] cache = new long[100010]; 
    long[] map = new long[100010]; 
    long pre = a; 
    for (int i = 0; i < k; i++) { 
     long num; 
     if (i == 0) 
      num = a; 
     else 
      num = (b * pre + c) % r; 
     cache[i] = num; 
     if (num <= k + 1) 
      map[(int) num]++; 
     pre = num; 
    } 

    pre = getNextMin(map, 0, k); 
    cache[(int)k] = pre; 
    map[(int)pre]++; 
    for (int i = 0; i <= (int)k; i++) { 
     long deque = cache[i]; 
     if (deque > k) { 
      long x = getNextMin(map, pre, k); 
      cache[i] = x; 
      map[(int)x]++; 
      pre = x; 
     } else { 
      if (deque < pre) { 
       if(map[(int)deque] == 1) { 
        cache[i] = deque; 
        pre = deque; 
        continue; 
       } 
      } 
      map[(int)deque]--; 
      long x = getNextMin(map, pre, k); 
      cache[i] = x; 
      pre = x; 
      map[(int)x]++; 
     } 
    } 

    return cache[(int)((n - 1) % (k + 1))]; 
} 

public static void main(String[] args) { 
    try { 
     Scanner s = new Scanner(new File("in.txt")); 
     int m = s.nextInt(); 
     FindTheMin f = new FindTheMin(); 

     for (int i = 1; i <= m; i++) { 
      int n, k, a, b, c, r; 
      n = s.nextInt(); 
      k = s.nextInt(); 
      a = s.nextInt(); 
      b = s.nextInt(); 
      c = s.nextInt(); 
      r = s.nextInt(); 
      System.out.println("Case #" + i + ": " + f.findNth(n, k, a, b, c, r)); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

} 

그리고 이런 것들을 배우는 가장 좋은 방법은 무엇입니까? 자바를 배우는 가장 좋은 방법은? 이 질문 https://www.facebook.com/hackercup/problems.php?pid=494433657264959&round=185564241586420

+6

** O (^ K) **는 무엇을 의미합니까? – MrSmith42

+3

[c] 태그가 붙은 이유는 무엇입니까? – AnT

+8

facebook 계정이없는 것을 선호하는 사람들을 위해 질문을 올리시겠습니까? – dasblinkenlight

답변

2

map[(int)x]++이었다 수행하는 다음과 같은 :

int index = (int) x; 
map[index]++; 
+1

나는 OP가'코드가 무엇을하는지 '알고 싶어한다고 생각합니다. 이것은 전체 로직의 일부일뿐입니다. 솔직히 말해서이 코드는 블랙 박스입니다 ... – Cratylus

+0

@Cratylus : 아마도 맞을지 모르지만 그렇습니다. 그 사람이 물었던 유일한 명확한 질문은 내가 최소한 대답 할 것이라고 생각했다. – Claudiu

+0

이것이 정말로 아래쪽 투표의 가치가있는 것인가? 나는 영업 비밀 질문의 일부에 정확하게 대답하고 있는데, 답장은 어떻게합니까? – Claudiu

1

은 무엇 map[(int)x]++; 무엇입니까?

java의 배열은 정수 인덱스 만 허용하지만 코드의 x는 긴 값입니다. 따라서는 int로 캐스트되어야한다 :

이 코드 배열 맵에서 인덱스 (X)에 요소를 취득 값에 1을 추가

동일 :

map[ix]++; // where ix = (int) x; 

질문 2 : 및 이런 것을 배우는 가장 좋은 방법은 무엇입니까? 자바를 배우는 가장 좋은 방법은?

구매, 읽고 이해 :

Robert Sedgewick, Algorithms Fourth Edition 
1

long x = getNextMin(map, pre, k); 
cache[i] = x; 
map[(int)x]++; 

x 긴하지만

에서 배열의 인덱스는 INT 수 있습니다. 더 중요하게는 getNextMinlong을 반환하지만 프로그래머는 그 값이 실제로 int (즉 x <= Integer.MAX_VALUE)임을 알고 있습니다. 그렇지 않으면 오버플로가 발생하여 x의 음수 값을 초래할 수 있으며 ArrayIndexOutOfBoundsException 예외가 발생할 수 있습니다. 자바는 정적으로 입력되기 때문에 getNextMin에 의해 반환되는 값이 int에 맞는 있지만

이제, 당신은 여전히 ​​int로 사용하도록 컴파일러에게 당신의 의도를 알려야합니다; 그렇지 않으면 컴파일러는 long이라고 가정합니다. 당신이 (int)x 볼 이유입니다 - 배열 인덱스는 코드 자체

map[(int)x]++; 

를 들어 유형 int

이어야하기 때문에

map[(int)x] = map[(int)x] + 1; 

로 서면 또는

int y = (int) x 
map[y]++; // or as map[y] = map[y] + 1 
로 수

getNextMin에 의해 반환 된 값이 gr 인 경우에도 Integer.MAX_VALUE보다 코드가 예외를 throw합니다. 따라서 프로그래머가 잠재적 인 예외를 처리하지 않는 것은 디자인 결함 일 수 있습니다.

관련 문제