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

题目是这样的:

给定一些 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. openjudge8465:马走日 [搜索]

    描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行为整数T ...

  2. 【SignalR学习系列】7. SignalR Hubs Api 详解(JavaScript 客户端)

    SignalR 的 generated proxy 服务端 public class ContosoChatHub : Hub { public void NewContosoChatMessage( ...

  3. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  4. Spring核心--IOC

    先说说Spring框架 Spring框架 Spring框架的作用 Spring 的核心(IOC功能) SpringAOP功能 原有的业务流程:请求->servlet-->service-- ...

  5. css鼠标样式cursor

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. 微服务(二)hystrix

    特性 1.延迟和失败容忍 防止级联错误,错误回退,优雅降级.快速失败和恢复 线程和信号量隔离 2.实时监控和配置更改 3.并发 并行执行,请求缓存,自动批处理失败请求 总运行流程 当你发出请求后,hy ...

  7. 拯救莫莉斯[GDOI2014]

    时间限制:1s     内存限制:256MB 问题描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标 ...

  8. js prototype 继承

    //继承 function inherits(ctor,superCtor){ ctor.super_ = superCtor; ctor.prototype = Object.create(supe ...

  9. Given two binary string, return their sum (also a binary string)

    主要思路:将二进制转化为十进制,然后进行十进制加法,最后再将加法所得的结果转化为二进制 public class BinarySum2 { public static void main(String ...

  10. 七月SSL行业新闻回顾

    大事件一:被泄露的私钥和基于假私钥进行的撤回 上个月,我们报告说Spotify和Cisco在应用程序中捆绑了有效证书的私钥.这些证书将根据基准要求被撤销,但应用程序不是泄露私钥的唯一来源.Koen R ...