感觉好久没刷题和写博客了。都有点生疏。电脑也不好用,双十一怎么还没来呀,快来快来!
明天要产品经理培训,我觉得这应该也是一个职业方向,感谢公司给我这个机会来提高浙江的能力,希望我在培训过程中可以越来越棒!棒棒!棒棒棒!
题目是矩形面积
在二维平面上有两个矩形,每个矩形由左下点和右上点坐标表示,求矩形的总面积。

示例1:

输入: -3, 0, 3, 4, 0, -1, 9, 2
输出: 45

解释1:

总面积为45

题解:

刚开始看到这个题,求总面积,那直接两个矩形面积相加再减去重叠的面积就可以了,一开始我分了好几种情况讨论,都是按照点的位置判断,结果有好多种情况,太容易搞混和遗漏了。之后灵光一闪,可以把点扩展成线来看,也用左下点和右上点坐标来表示重叠部分的矩形。另个矩形的左边x坐标进行比较,将大的值赋值给重叠矩形的左下X值,同理右边比较,将小的赋值给重叠矩形的右上x值,下边比较,将大的值赋值给重叠矩形的左下y值,上边比较,将小的赋值给重叠矩形的右上y值。那么我们就可以求出重叠部分的矩形面基啦。注意的是我们必须保证右上x大于左下线,右上y大于左下y。
在提交答案时,发现有个用例(代码中)用int会出现数据溢出的情况,所以我们用long数据类型。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

import java.util.*;
import java.math.*;

public class ZYH {
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);
long X1 = A;
long X2 = C;
long Y1 = F;
long Y2 = H;
if (A < E)
X1 = E;
if (C > G)
X2 = G;
if (F < B)
Y1 = B;
if (H > D)
Y2 = D;
if ((X2 - X1) > 0 && (Y2 - Y1 > 0)) {
long area = (X2 - X1) * (Y2 - Y1);
long ans = area1 + area2 - area;
int res = (int) ans;
return res;
}
return area1 + area2;
}

public static void main(String[] args) {
ZYH s = new ZYH();
System.out.print(s.computeArea(-1500000001, 0, -1500000000, 1, 1500000000, 0, 1500000001, 1));

}
}