HashMap 数组应用面试题(Point)
今天看了一题面试题,以为很简单,不过自己写了遍,没有完全写出来:
题目是这样的:
给定一些 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)的更多相关文章
- HashMap常见面试题整理
花了三天时间来仔细阅读hashMap的源码,期间补了下不少数据结构的知识,刷了不少相关的面试题并进行了整理 1.谈一下HashMap的特性? 1.HashMap存储键值对实现快速存取,允许为null. ...
- java面试题之----HashMap常见面试题总结
“你用过HashMap吗?” “什么是HashMap?你为什么用到它?” 几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable ...
- HashMap 相关面试题及其解答
Q:HashMap 的数据结构? A:哈希表结构(链表散列:数组+链表)实现,结合数组和链表的优点.当链表长度超过 8 时,链表转换为红黑树. transient Node<K,V>[] ...
- 【转载】关于Java String, StringBuilder, StringBuffer, Hashtable, HashMap的面试题
REF: http://blog.csdn.net/fightforyourdream/article/details/15333405 题目是一道简单的小程序,像下面这样:[java] view p ...
- java数组面试题
一维数组可以写成:int[ ]x 或者int x[ ]: 二维数组可以写成:int[ ] y [ ] 或者int y[ ][ ] 或者int [ ][ ]y 面试题如下: 声明数组int[ ...
- HashMap常见面试题
1.HashMap底层是通过什么来实现的? 在JDK1.7中是通过数组+链表来实现的: 在JDK1.8中是通过数组+链表+红黑树来实现的 2.HashMap在JDK1.8中为什么使用红黑树? 为了弥补 ...
- Java面试系列第3篇-HashMap相关面试题
HashMap是非线程安全的,如果想要用线程安全的map,可使用同步的HashTable或通过Collections.synchronizeMap(hashMap)让HashMap变的同步,或者使用并 ...
- HashMap(二)之面试题系列
定义类考题 什么是Hash?什么是HashMap? HashMap 的工作原理是什么 HashMap HashTable的区别 为什么要用HashMap 源码类考题 什么是hash碰撞,怎么减少碰撞, ...
- PHP数组函数试题
使用Ctrl+A查看答案 1.将数组的键名全部转换成小写和大写的函数是什么?答:array_change_key_case($array [,CASE_LOWER|CASE_UPPER]) 2.创建一 ...
随机推荐
- MySQL巧用自定义函数进行查询优化
用户自定义变量是一个很容易被遗忘的MySQL特性,但是用的好,发挥其潜力,在很多场景都可以写出非常高效的查询语句. 一. 实现一个按照actorid排序的列 mysql; Query OK, rows ...
- Spring事件解析
首先介绍Spring事件相关类的关系: 其中EventListener与EventObject均是Java SE的范畴,源码如下: package java.util; public interfac ...
- Objectiv-c - UICollectionViewLayout自定义布局-瀑布流
最近刚写的一个简单的瀑布流. 整体思路可能不是很完善. 不过也算是实现效果了. 高手勿喷 思路: 自定义UICollectionViewLayout实际上就是需要返回每个item的fram就可以了. ...
- 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位系统 ...
- 完整版百度地图点击列表定位到对应位置并有交互动画效果demo
1.前言 将地图嵌入到项目中的需求很多,好吧,我一般都是用的百度地图.那么今天就主要写一个完整的demo.展示一个列表,点击列表的任一内容,在地图上定位到该位置,并有动画效果.来来来,直接上demo ...
- Mybatis Dynamic Query 1.0.2版本
项目地址:https://github.com/wz2cool/mybatis-dynamic-query 文档地址:https://wz2cool.gitbooks.io/mybatis-dynam ...
- C++ STL pair详解
一.解释: p { margin-bottom: 0.25cm; direction: ltr; color: #00000a; line-height: 120%; text-align: left ...
- 深入理解Spring MVC 思想
目录 一.前言二.spring mvc 核心类与接口三.spring mvc 核心流程图 四.spring mvc DispatcherServlet说明 五.spring mvc 父子上下文的说明 ...
- HAproxy部署配置
HAproxy部署配置 拓扑图 说明: haproxy服务器IP:172.16.253.200/16 (外网).192.168.29.140/24(内网) 博客服务器组IP:192.168.29.13 ...
- How to create a jump server in AWS VPC
本来是写的Word文档,给其他国家的同时看的,所以一开始就是英文写的,也没打算翻译成为中文了,顺便抱怨下,网上资料找了很久的资料都没有看到介绍怎么在单机环境下搭建RD Gateway的,写本文的目的是 ...