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

题目是这样的:

给定一些 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. MySQL巧用自定义函数进行查询优化

    用户自定义变量是一个很容易被遗忘的MySQL特性,但是用的好,发挥其潜力,在很多场景都可以写出非常高效的查询语句. 一. 实现一个按照actorid排序的列 mysql; Query OK, rows ...

  2. Spring事件解析

    首先介绍Spring事件相关类的关系: 其中EventListener与EventObject均是Java SE的范畴,源码如下: package java.util; public interfac ...

  3. Objectiv-c - UICollectionViewLayout自定义布局-瀑布流

    最近刚写的一个简单的瀑布流. 整体思路可能不是很完善. 不过也算是实现效果了. 高手勿喷 思路: 自定义UICollectionViewLayout实际上就是需要返回每个item的fram就可以了. ...

  4. CentOS 7.3.1611系统安装配置图解教程

    操作系统:CentOS 7.3.1611 IP地址:192.168.21.130 网关:192.168.21.2 DNS:8.8.8.8 8.8.4.4 备注: CentOS 7.x系列只有64位系统 ...

  5. 完整版百度地图点击列表定位到对应位置并有交互动画效果demo

    1.前言 将地图嵌入到项目中的需求很多,好吧,我一般都是用的百度地图.那么今天就主要写一个完整的demo.展示一个列表,点击列表的任一内容,在地图上定位到该位置,并有动画效果.来来来,直接上demo  ...

  6. Mybatis Dynamic Query 1.0.2版本

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

  7. C++ STL pair详解

    一.解释: p { margin-bottom: 0.25cm; direction: ltr; color: #00000a; line-height: 120%; text-align: left ...

  8. 深入理解Spring MVC 思想

    目录  一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...

  9. HAproxy部署配置

    HAproxy部署配置 拓扑图 说明: haproxy服务器IP:172.16.253.200/16 (外网).192.168.29.140/24(内网) 博客服务器组IP:192.168.29.13 ...

  10. How to create a jump server in AWS VPC

    本来是写的Word文档,给其他国家的同时看的,所以一开始就是英文写的,也没打算翻译成为中文了,顺便抱怨下,网上资料找了很久的资料都没有看到介绍怎么在单机环境下搭建RD Gateway的,写本文的目的是 ...