什么是map [(int)x] ++;它的作用是什么?

时间:2013-02-05 20:47:23

标签: java algorithm

嘿,我参加了Facebook黑客大赛,我得到了这个问题的解决方案。 我按顺序O(K ^ 2)解决了问题,但是这个人在O(^ K)中解决了它。 请解释一下代码在做什么。

    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

3 个答案:

答案 0 :(得分:2)

map[(int)x]++与以下内容相同:

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

答案 1 :(得分:1)

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

java中的

数组只接受整数索引,但代码中的x是一个long值。 因此必须将其转换为int:

此代码从数组映射获取索引x处的元素,并将值加1:

同样如下:

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

问题2: 学习这样的东西的最佳方法是什么?学习java的最好方法是什么?

购买,阅读和理解:

Robert Sedgewick, Algorithms Fourth Edition

答案 2 :(得分: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返回的值大于Integer.MAX_VALUE,代码将抛出异常。因此,程序员可能没有处理潜在的异常,这可能是一个设计缺陷。