【问题标题】:Gridland Metro HackerRankGridland Metro HackerRank
【发布时间】:2020-05-09 21:58:01
【问题描述】:

我在hackerRank 上解决了这个question。我已经浏览了整个讨论部分,尝试了所有建议的测试用例并获得了预期的结果。我想我可能会犯一些愚蠢的代码错误,因为我确信我已经考虑过/考虑了实现中的每一个场景。如果我的代码有任何错误,请您帮我指出。

public static void main(String[] args) throws IOException {
    BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
    String strNum[] = bf.readLine().split("\\s");
    double n = Double.parseDouble(strNum[0]);
    double m = Double.parseDouble(strNum[1]);
    double k = Double.parseDouble(strNum[2]);

    Map<Double, TreeMap<Double, Double>> map = new HashMap<>();
    while (k > 0) {
        strNum = bf.readLine().split("\\s");
        double r = Double.parseDouble(strNum[0]);
        double c1 = Double.parseDouble(strNum[1]);
        double c2 = Double.parseDouble(strNum[2]);
        TreeMap<Double, Double> innerMap = map.get(r);
        if (innerMap != null) {
            Double x = innerMap.get(c1);
            if (x != null) {
                if (c2 > x) {
                    innerMap.put(c1, c2);
                }
            } else {
                innerMap.put(c1, c2);
            }
        } else {
            innerMap = new TreeMap<Double, Double>();
            innerMap.put(c1, c2);
            map.put(r, innerMap);
        }
        k--;
    }
    double count = (n - map.size()) * m;
    for (Map.Entry<Double, TreeMap<Double, Double>> e : map.entrySet()) {
        TreeMap<Double, Double> innerMap = e.getValue();
        double start = innerMap.firstKey();
        double end = innerMap.firstEntry().getValue();
        for (Map.Entry<Double, Double> e2 : innerMap.entrySet()) {
            double x = e2.getKey();
            double y = e2.getValue();
            if (y > end) {
                if (x > end) {
                    count += ((x - end) - 1);
                }
                end = y;
            }
        }
        count += (m - (end - start + 1));
    }
    System.out.println(String.format("%.0f", count));
}

24/31 测试用例失败。非常感谢任何帮助。

【问题讨论】:

  • 在不深入细节的情况下,挑战描述指定输入是整数,但是您将它们作为双精度处理。这可能是您许多问题的根源,因为不建议使用双打数学。
  • 它似乎没有通过以下测试用例:1 1 1 然后 1 1 1。它应该返回 1,但返回 0。
  • 另外,在开始寻找解决方案之前,在用户输入之后,您需要添加边缘验证,例如: if (n
  • @fpezzini 对于 111,111 它应该返回 0。因为只有一个单元格。这也是一条火车轨道。所以没有单元格可用于灯柱,因此结果应为 0。
  • 啊,好点子。看起来你已经很接近了,我想说想想可能的边缘情况,一些单元测试会检查这一点(就像我上面的推荐一样)。

标签: java algorithm optimization data-structures greedy


【解决方案1】:

@fpezzini 有一个关于双打的观点:关于输入

1000000000 1000000000 1
1 1 1

您的代码打印的是1000000000000000000,而不是999999999999999999,因为后者不能表示为双精度。

【讨论】:

  • 我有一个问题!为什么 double 可以存储 1000000000000000000(19 位)而不是 999999999999999999(18 位)?
  • @saurabhgupta Double 旨在存储比 Long 更大的数字,使用相同的位数。结果,大数字越来越积极地四舍五入。 IEEE 754(Java Doubles 遵循的标准)使用二进制,但作为类比,我可以仅使用科学计数法中的四个字符将 1000000000000000000 写为 1e18,但我不能简洁地写出 999999999999999999。
【解决方案2】:

如果您的代码读取 r,c1,c2 后跟 r,c1,c2'c2'&lt;c2,它将默默地放弃前一个轨道。

【讨论】:

  • 它不会因为有一个条件 (if(y>end)) 在你的情况下 y=c2' 和 end=c2 ,它只在 c2' >c2 时执行
  • @saurabhgupta IIRC TreeMap 不是多图——它在读取输入时被丢弃。
  • 给我一个测试用例,我看看这段代码是否产生了预期的输出。
  • @saurabhgupta 1 行 2 列,轨道 1 1 2 和 1 1 1 按此顺序。
  • 答案是0,因为第一条轨道占据了所有的方格,但我认为你的代码会产生1。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2017-06-23
  • 1970-01-01
  • 2022-08-16
  • 2015-11-05
  • 2021-10-24
  • 2020-08-08
  • 2018-09-13
相关资源
最近更新 更多