今天看了一题面试题,以为很简单,不过自己写了遍,没有完全写出来:

题目是这样的:

给定一些 points 和一个 origin,从 points 中找到 k 个离 origin 最近的点。按照距离由小到大返回。如果两个点有相同距离,则按照x值来排序;若x值也相同,就再按照y值排序。

样例
  给出 points = [[4,6],[4,7],[4,4],[2,5],[1,1]], origin = [0, 0], k = 3
  返回 [[1,1],[2,5],[4,4]]

首先我们先创建一个Point类

 package work;

 public class Point {
private int x;
private int y; public Point(int x, int y) {
super();
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
@Override
public String toString() {
return " [" + x +","+ y + "]";
} public Point getPoint(Point x){
return x;
} }

再创建一个main方法,用来调用函数和执行程序

 public class Solution {

     public static void main(String[] args) {
Point[] points = new Point[4];
points[0] = new Point(5, 5); points[1] = new Point(7, 8);
points[2] = new Point(2, 5);
points[3] = new Point(4, 7); Point point = new Point(4, 4); Point[] s = kClosest(points, point, 3);
for (Point p : s) {
System.out.println(p);
} }

根据题目要求,我们可以封装一个求点点之间距离的方法,直接放在main方法下面

 public static double lengths(Point points, Point origin) {

         return Math.sqrt(Math.pow(Math.abs(points.getX() - origin.getX()), 2)
+ Math.pow(Math.abs(points.getY() - origin.getY()), 2));
}

最后就是我们的重点了,实现函数并返回一个point数组

 public static Point[] kClosest(Point[] points, Point origin, int k) {
if (k > points.length) {
Point p = new Point(0, 0);
Point[] arrLength = new Point[1];
arrLength[0] = p;
return arrLength;
}
Point[] arrLength = new Point[points.length];
HashMap<Point, Double> allPoint = new HashMap<Point, Double>();
for (int i = 0; i < points.length; i++) {
double length1 = lengths(points[i], origin);
allPoint.put(points[i], length1);
}
Set<Point> set = allPoint.keySet(); Iterator<Point> ite = set.iterator();
int count = 0;
//循环迭代器
while (ite.hasNext()) {
//获取map中的key
Point ts = ite.next(); //下标为0的时候,把key赋值到arrLength数组
Point s=null;
if (count == 0) { arrLength[0] = ts.getPoint(ts); } else {
//当前下标数组获取值
arrLength[count]=ts.getPoint(ts); //当计数大于0的时候,进行循环判断
for (int n = 0; n < count; n++) { //判断当前的L长度与数组里面所有L比较,判断大于L的n boolean bl=allPoint.get(ts) < allPoint.get(arrLength[n]); if (bl) {
//获取下标n,将n后面的数组值后移一位 for (int num = count; num > n; num--) { arrLength[num] = arrLength[num-1]; }
arrLength[n]=ts.getPoint(ts); break;
} }
}
count++; } Point[] arrLength1 = new Point[k]; System.arraycopy(arrLength, 0, arrLength1, 0, k); return arrLength1;
}

功能基本实现,由于个人比较懒惰,所以没有对相同距离x,y坐标的判断。

也是个人能力有限,很久没有接触这种纯面试题了,看来要好好学习,多操练操练。。。。

实现思路:

1.先把Point对象和对应到源点长度,前者作为key,后者作为value存在Hashmap里面,由于不考了会重复点,所以point是唯一的;

2.排序对应的value

  2.1 使用迭代器,获取hashmap对应的key,并把key遍历放进新的数组arrLength;首先把第一个放进去

  2.2 迭代获取第二个key,并获取value和第一个比较,如果value小于第一个,执行呼唤。

  2.3 依次判断,每次循环前,数组都是已经从小到大排序,只需要找到第一个大于当前value的point,并把后面所有的Point在数组中下标后移一位。

3.通过K值,来截取数组,并生成新的数组,并return

HashMap 数组应用面试题(Point)的更多相关文章

  1. HashMap常见面试题整理

    花了三天时间来仔细阅读hashMap的源码,期间补了下不少数据结构的知识,刷了不少相关的面试题并进行了整理 1.谈一下HashMap的特性? 1.HashMap存储键值对实现快速存取,允许为null. ...

  2. java面试题之----HashMap常见面试题总结

    “你用过HashMap吗?” “什么是HashMap?你为什么用到它?” 几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable ...

  3. HashMap 相关面试题及其解答

    Q:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>[] ...

  4. 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题

    REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...

  5. java数组面试题

    一维数组可以写成:int[ ]x 或者int x[ ]: 二维数组可以写成:int[ ] y [ ] 或者int y[ ][ ] 或者int [ ][ ]y 面试题如下:       声明数组int[ ...

  6. HashMap常见面试题

    1.HashMap底层是通过什么来实现的? 在JDK1.7中是通过数组+链表来实现的: 在JDK1.8中是通过数组+链表+红黑树来实现的 2.HashMap在JDK1.8中为什么使用红黑树? 为了弥补 ...

  7. Java面试系列第3篇-HashMap相关面试题

    HashMap是非线程安全的,如果想要用线程安全的map,可使用同步的HashTable或通过Collections.synchronizeMap(hashMap)让HashMap变的同步,或者使用并 ...

  8. HashMap(二)之面试题系列

    定义类考题 什么是Hash?什么是HashMap? HashMap 的工作原理是什么 HashMap HashTable的区别 为什么要用HashMap 源码类考题 什么是hash碰撞,怎么减少碰撞, ...

  9. PHP数组函数试题

    使用Ctrl+A查看答案 1.将数组的键名全部转换成小写和大写的函数是什么?答:array_change_key_case($array [,CASE_LOWER|CASE_UPPER]) 2.创建一 ...

随机推荐

  1. WIN10下设置惠普HP1050等打印机打印颜色,只打黑白或彩色

    今天同事问了一个问题,如何在WIN10下,设置惠普打印机只打印黑白, 上网搜了下,没有找到任何信息,只有在WIN8前系统设置的内容,经过几番折腾,得出此文. WIN10下设置惠普HP1050等打印机打 ...

  2. vue.js移动端app实战1:初始配置

    本系列将会用vue.js2制作一个移动端的webapp单页面,页面不多,大概在7,8个左右,不过麻雀虽小,五脏俱全,常用的效果如轮播图,下拉刷新,上拉加载,图片懒加载都会用到.css方面也会有一些描述 ...

  3. 全面理解SSD和NAND Flash

    Flash Memory又叫做闪存,是一种非易失性存储器.非易失性是指断电之后数据不会丢失,这里就涉及到断电保护(后面详细讲解). 总体思路 1.NAND Flash的用途. 2.NAND Flash ...

  4. koa2 use里面的next到底是什么

    koa2短小精悍,女人不爱男人爱. 之前一只有用koa写一点小程序,自认为还吼吼哈,知道有一天某人问我,你说一下 koa或者express中间件的实现原理.然后我就支支吾吾,好久吃饭都不香. 那么了解 ...

  5. UglifyJS-- 对你的js做了什么

    也不是闲着没事去看压缩代码,但今天调试自己代码的时候发现有点意思.因为是自己写的,虽然压缩了,格式化之后还是很好辨认.当然作为min的首要准则不是可读性,而是精简.那么它会尽量的缩短代码,尽量的保持一 ...

  6. Python学习记录----IDE安装

    摘要: 安装eric5 一 确定python版本 安装的最新版本:python3.3 下载连接:http://www.python.org/getit/ 二 确定pyqt版本 安装的最新版本:PyQt ...

  7. Mybatis Dynamic Query 1.0.2版本

    项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...

  8. zabbix_server----邮箱报警

    zabbix邮件报警部署!!!!!!!!!!!!!!! Zabbix监控服务端.客户端都已经部署完成,被监控主机已经添加,Zabiix监控运行正常,通过查看Zabbix监控服务器,可以了解服务器的运行 ...

  9. linux运维、架构之路-rsync

    1 .rsync介绍 rsync是实现全量及增量的本地或远程数据镜像同步备份的工具 rsync常用命令参数 命令参数 参数说明 -a (--archive) 归档模式,表示以递归方式传输文件,并保持所 ...

  10. Java的原始类型自动包装与解包机制

    java5之后对原始数据类型如int.char.long等基本数据类型有自动打包成相应的复合类型Integer.Character.Long等的机制:也可以将复合类型自动转换为原始类型. 这取决于程序 ...