马上就要毕业了,深感自己大学生活有些虚度光阴的感觉,从今天起开始一边JAVASE — JAVAEE 等学习,一边开始复习和训练算法和数据结构,计算机组成原理等专业知识.
题目:
有一个城市需要修建,给你N个民居的坐标X,Y,问把这么多民居全都包进城市的话,城市所需最小面积是多少(注意,城市为平行于坐标轴的正方形)
输入描述:
第一行为N,表示民居数目(2≤N≤1000)
输出描述:
城市所需最小面积
示例
输入
2
0 0
2 2输出
4
分析:
我刚拿到这道题的时候,我的第一反应是在脑海里面建立了一个坐标系,具体的分析下来感觉这道题还是不难的,主要的我个人认为在于
- 如何存储输入的数据,按照X,Y的顺序
- 如何进行比较获得最大值最小值
- 最终计算得出面积
所以我就把这道题按照上面三个点分析来进行代码的编写。
因为我要是java方面的学习,所以这里的代码实现就是用了java语言,jdk1.8 。
import java.util.Scanner;
public class PeopleLivingArea {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);//使用Scanner类来读取数据
int num = sc.nextInt();//数组的长度
long[] x = new long[num];//定义两个数组一个存储x,另一个存储y
long[] y = new long[num];
for (int i = 0; i < num; i++) {
x[i] = sc.nextLong();//使用nextInt的特性,以空格为中断符来读取数据
y[i] = sc.nextLong();
}
//遍历数组返回最大,最小值
long minx = getMinX(x);
long miny = getMinY(y);
long maxx = getMaxX(x);
long maxy = getMaxY(y);
//算出两点间距离
long x1 = maxx - minx;
long x2 = maxy - miny;
//因为题上说要是一个正方形,所以这个方法就用来判断哪边更长,将长边的值赋值给短边,最后形成一个正方形
if (x1 > x2) {
x2 = x1;
System.out.println(x1 * x2);
} else {
x1 = x2;
System.out.println(x1 * x2);
}
}
private static long getMaxY(long[] y) {
// TODO Auto-generated method stub
long max = y[0];
for (long i : y)
if (i > max)
max = i;
return max;
}
private static long getMaxX(long[] x) {
// TODO Auto-generated method stub
long max = x[0];
for (long i : x)
if (i > max)
max = i;
return max;
}
private static long getMinY(long[] y) {
// TODO Auto-generated method stub
long min = y[0];
for (long i : y)
if (min > i)
min = i;
return min;
}
private static long getMinX(long[] x) {
// TODO Auto-generated method stub
long min = x[0];
for (long i : x)
if (min > i)
min = i;
return min;
}
}
在做这道题的时候还是遇到了一些坑的,比如刚开始实用的都是int类型的数据,int在java虚拟机中只占4个字节 32位,所以int类型的数据最大值只能到-2^31 - 2^31 -1 也就是±21亿左右,所以在提交的时候只有百分之26的数据通过测试了,提醒自己以后要注意!
希望自己以后天天都可以坚持这样!