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.创建一 ...
随机推荐
- openjudge8465:马走日 [搜索]
描述 马在中国象棋以日字形规则移动. 请编写一段程序,给定n*m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点. 输入 第一行为整数T ...
- 【SignalR学习系列】7. SignalR Hubs Api 详解(JavaScript 客户端)
SignalR 的 generated proxy 服务端 public class ContosoChatHub : Hub { public void NewContosoChatMessage( ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- Spring核心--IOC
先说说Spring框架 Spring框架 Spring框架的作用 Spring 的核心(IOC功能) SpringAOP功能 原有的业务流程:请求->servlet-->service-- ...
- css鼠标样式cursor
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 微服务(二)hystrix
特性 1.延迟和失败容忍 防止级联错误,错误回退,优雅降级.快速失败和恢复 线程和信号量隔离 2.实时监控和配置更改 3.并发 并行执行,请求缓存,自动批处理失败请求 总运行流程 当你发出请求后,hy ...
- 拯救莫莉斯[GDOI2014]
时间限制:1s 内存限制:256MB 问题描述 莫莉斯·乔是圣域里一个叱咤风云的人物,他凭借着自身超强的经济头脑,牢牢控制了圣域的石油市场. 圣域的地图可以看成是一个n*m的矩阵.每个整数坐标 ...
- js prototype 继承
//继承 function inherits(ctor,superCtor){ ctor.super_ = superCtor; ctor.prototype = Object.create(supe ...
- Given two binary string, return their sum (also a binary string)
主要思路:将二进制转化为十进制,然后进行十进制加法,最后再将加法所得的结果转化为二进制 public class BinarySum2 { public static void main(String ...
- 七月SSL行业新闻回顾
大事件一:被泄露的私钥和基于假私钥进行的撤回 上个月,我们报告说Spotify和Cisco在应用程序中捆绑了有效证书的私钥.这些证书将根据基准要求被撤销,但应用程序不是泄露私钥的唯一来源.Koen R ...