2013-02-05 249 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(); 
    } 
} 

} 

什麼是最好的方式來學習這樣的事情。學習java的最佳方式是什麼? 這是問題 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

這真的值得投票嗎?我準確地回答了OP的部分問題,您對此做出的迴應如何? – Claudiu

1

什麼是map[(int)x]++;它能做什麼?

java中的數組只接受一個整數索引,但代碼中的x是一個長整型值。因此 它必須被鑄造爲int:

該代碼在從陣列地圖索引x得到元件,並增加了1的值:

相同:

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

問題2: 而學習這樣的東西的最佳方式是什麼?學習java的最佳方式是什麼?

買,閱讀和理解:

Robert Sedgewick, Algorithms Fourth Edition 
1

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

雖然x是一個長期的,陣列的索引可以僅是int。此外,更重要的是,雖然getNextMin返回long,但程序員知道該值實際上是int(即x <= Integer.MAX_VALUE),否則可能會發生溢出,導致x爲負值,這會導致ArrayIndexOutOfBoundsException異常。

現在因爲Java是靜態類型,雖然getNextMin返回的值適配到int,你仍然必須告訴編譯器你打算使用它作爲一個int;否則編譯器會認爲它是long。這就是爲什麼你看到(int)x - 因爲數組索引的類型必須爲int

爲代碼本身

map[(int)x]++; 

可以寫成

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這段代碼會拋出一個異常。所以這可能是一個設計缺陷,程序員沒有處理潛在的異常。

相關問題