问题:
找到2D平面中两个直线矩形所覆盖的总面积。
代码:
public class Solution {
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int sum=(C - A) * (D - B) + (H - F) * (G - E);
int shadow=Math.max((Math.min(G, C) - Math.max(A, E)), 0) * Math.max((Math.min(D, H) - Math.max(B, F)), 0);
return sum-shadow;
}
}
正如您所见,我编写了Java代码来解决这个问题。但我不知道为什么我不能通过一次测试。
Input:
-1500000001
0
-1500000000
1
1500000000
0
1500000001
1
Output:
-1294967294
Expected:
2
我使用python实现相同的方法,它工作正常。我不知道为什么Java版本无法通过这个测试。任何人都可以告诉我为什么?
另一个版本:
public class Solution {
public int computeArea(int A, int B, int C, int D, int E, int F, int G, int H) {
int area1 = (C-A) * (D-B);
int area2 = (G-E) * (H-F);
int overlapRegion = overlap(A, B, C, D, E, F, G, H);
return area1 + area2 - overlapRegion;
}
private int overlap(int A, int B, int C, int D, int E, int F, int G, int H) {
int h1 = Math.max(A, E);
int h2 = Math.min(C, G);
int h = h2 - h1;
int v1 = Math.max(B, F);
int v2 = Math.min(D, H);
int v = v2 - v1;
if(h<=0 || v<=0) return 0;
else return h*v;
}
}
答案 0 :(得分:1)
由于Java没有无符号值,因此总和已经溢出并变为负数。使用long
代替int
可为您的号码留出更多空间。