【发布时间】: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