我要拿offer练习(第一天)

马上就要毕业了,深感自己大学生活有些虚度光阴的感觉,从今天起开始一边JAVASE — JAVAEE 等学习,一边开始复习和训练算法和数据结构,计算机组成原理等专业知识.

  • 面试真题一

题目:
有一个城市需要修建,给你N个民居的坐标X,Y,问把这么多民居全都包进城市的话,城市所需最小面积是多少(注意,城市为平行于坐标轴的正方形)

输入描述:

第一行为N,表示民居数目(2≤N≤1000)

输出描述:

城市所需最小面积

示例

输入

2
0 0
2 2

输出

4

分析:
我刚拿到这道题的时候,我的第一反应是在脑海里面建立了一个坐标系,具体的分析下来感觉这道题还是不难的,主要的我个人认为在于

  1. 如何存储输入的数据,按照X,Y的顺序
  2. 如何进行比较获得最大值最小值
  3. 最终计算得出面积

所以我就把这道题按照上面三个点分析来进行代码的编写。

因为我要是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的数据通过测试了,提醒自己以后要注意!

在这里插入图片描述希望天天

希望自己以后天天都可以坚持这样!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值