1 哈希表(散列)-Google 上机题
1) 看一个实际需求,google 公司的一个上机题:
2) 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址..),当输入该员工的 id 时,要求查
找到该员工的 所有信息.
3) 要求: 不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)
 
2 哈希表的基本介绍
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通
过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组
叫做散列表。

3. google 公司的一个上机题:
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址..),当输入该员工的 id 时,
要求查找到该员工的 所有信息.
要求:
  1) 不使用数据库,,速度越快越好=>哈希表(散列)
  2) 添加时,保证按照 id 从低到高插入 
  3) 使用链表来实现哈希表, 该链表不带表头[即: 链表的第一个结点就存放雇员信息]
  4) 思路分析并画出示意图

  5) 代码实现
  1. public class HashTableDemo {
  2.  
  3. public static void main(String[] args) {
  4.  
  5. HashTable hashTable = new HashTable(7);
  6.  
  7. String key = "";
  8. Scanner scanner = new Scanner(System.in);
  9. while(true) {
  10.  
  11. System.out.println("add:添加雇员");
  12. System.out.println("list:查看雇员");
  13. System.out.println("find:查找雇员");
  14. System.out.println("del:删除雇员");
  15. System.out.println("exit:退出");
  16.  
  17. key = scanner.next();
  18. switch (key) {
  19. case "add":
  20. System.out.println("请输入id:");
  21. int id = scanner.nextInt();
  22. System.out.println("请输入名字:");
  23. String name = scanner.next();
  24.  
  25. Emp emp = new Emp(id, name);
  26. hashTable.add(emp);
  27. break;
  28. case "list":
  29. hashTable.list();
  30. break;
  31. case "find":
  32. System.out.println("请输入id:");
  33. int id2 = scanner.nextInt();
  34. hashTable.findEmpById(id2);
  35. break;
  36. case "del":
  37. System.out.println("请输入id:");
  38. int id3 = scanner.nextInt();
  39. hashTable.del(id3);
  40. break;
  41. case "exit":
  42. System.exit(10);
  43. default:
  44. break;
  45. }
  46. }
  47. }
  48. }
  1. // emp
  2. class Emp{
  3. public int id;
  4. public String name;
  5. public Emp next;
  6. public Emp(int id, String name) {
  7. super();
  8. this.id = id;
  9. this.name = name;
  10. }
  11. }
  1. // EmpLinkedList
  2. class EmpLinkedList{
  3. // 头指针,执行第一个Emp,因此我们这个链表的head,是直接指向第一个Emp
  4. private Emp head;
  5.  
  6. // id是自增长的
  7. public void add(Emp emp) {
  8. // 如果是添加一个雇员
  9. if(head == null) {
  10. head = emp;
  11. return;
  12. }
  13. // 如果不是第一个
  14. Emp curEmp = head;
  15. while(true) {
  16. if(curEmp.next == null) {
  17. break;
  18. }
  19. curEmp = curEmp.next;
  20. }
  21. curEmp.next = emp;
  22. }
  23.  
  24. public void list(int no) {
  25. if(head == null) {
  26. System.out.println("第" + (no+1) + "条链表为空!");
  27. return;
  28. }
  29. System.out.println("第" + (no+1) + "条链表信息为:");
  30. Emp curEmp = head;
  31. while(true) {
  32. System.out.printf("=> id=%d name=%s\t",curEmp.id,curEmp.name);
  33. if(curEmp.next == null) {
  34. break;
  35. }
  36. curEmp = curEmp.next;
  37. }
  38. System.out.println();
  39. }
  40.  
  41. // 根据id查找雇员
  42. public Emp findEmpByid(int id) {
  43. if(head == null) {
  44. System.out.println("链表为空");
  45. return null;
  46. }
  47. Emp curEmp = head;
  48. while(true) {
  49. if(curEmp.id == id) {
  50. break;
  51. }
  52. if(curEmp.next == null) {
  53. System.out.println("遍历完了,没有找到!");
  54. curEmp = null;
  55. break;
  56. }
  57. curEmp = curEmp.next;
  58. }
  59. return curEmp;
  60. }
  61.  
  62. // 根据id进行删除
  63. public boolean del(int id) {
  64. boolean flag = false;
  65. if(head == null) {
  66. System.out.println("当前链表为空!");
  67. return flag;
  68. }
  69. if(head.id == id) {
  70. head = null;
  71. flag = true;
  72. return flag;
  73. }
  74. Emp curEmp = head;
  75. while(true) {
  76. // 找到了改雇员
  77. if(curEmp.next.id == id) {
  78. curEmp.next = curEmp.next.next;
  79. curEmp.next = null;
  80. return (flag == false);
  81. }
  82. // 没有找到
  83. if(curEmp.next == null) {
  84. System.out.println("没有找改雇员!");
  85. curEmp = null;
  86. return flag;
  87. }
  88. curEmp = curEmp.next;
  89. }
  90. }
  91. }
  1. // 哈希表
  2. class HashTable{
  3.  
  4. private EmpLinkedList[] empLinkedListArr;
  5. private int size;
  6. public HashTable(int size) {
  7. super();
  8. this.size = size;
  9. empLinkedListArr = new EmpLinkedList[size];
  10.  
  11. for(int i = 0; i < size; i++){
  12. empLinkedListArr[i] = new EmpLinkedList();
  13. }
  14. }
  15.  
  16. // 添加雇员
  17. public void add(Emp emp) {
  18. // 根据员工的id得到改员工应该添加到哪条链表
  19. int empLinkedListNo = hashFun(emp.id);
  20. // 将emp添加到对应的链表中
  21. empLinkedListArr[empLinkedListNo].add(emp);
  22. }
  23.  
  24. public void list() {
  25. for (int i = 0; i < empLinkedListArr.length; i++) {
  26. empLinkedListArr[i].list(i);
  27. }
  28. }
  29.  
  30. public void findEmpById(int id) {
  31. int empLinkedListNo = hashFun(id);
  32. Emp emp = empLinkedListArr[empLinkedListNo].findEmpByid(id);
  33. if(emp != null) {
  34. System.out.println("在第" + (empLinkedListNo+1) + "条链表中找到id = " + id + "雇员");
  35. } else {
  36. System.out.println("在哈希表中没有找到");
  37. }
  38. }
  39.  
  40. public void del(int id) {
  41. int empLinkedListNo = hashFun(id);
  42. boolean flag = empLinkedListArr[empLinkedListNo].del(id);
  43. if(flag == true) {
  44. System.out.println("在第" + (empLinkedListNo+1) + "条链表中删除了id = " + id + "雇员");
  45. } else {
  46. System.out.println("在哈希表中没有找到");
  47. }
  48.  
  49. }
  50.  
  51. public int hashFun(int id) {
  52. return id %size;
  53. }
  54. }

注意:不要把链表的第一个节点(头节点)删除了,不然整条链表没了。(还可以改良)

思考:如果 id 不是从低到高插入,但要求各条链表仍是从低到高,怎么解决?

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

觉得不错的可以点一下右边的推荐哟!

Java 哈希表(google 公司的上机题)的更多相关文章

  1. Java哈希表入门

    Java哈希表(Hash Table) 最近做题经常用到哈希表来进行快速查询,遂记录Java是如何实现哈希表的.这里只简单讲一下利用Map和HashMap实现哈希表. 首先,什么是Map和HashMa ...

  2. 使用java实现希表的基础功能

    用java代码完成哈希表数据结构的简单实现, 以公司雇员的添加修改作为模拟实例 具体代码如下: package com.seizedays.hashtable; import java.util.Sc ...

  3. java——哈希表 HashTable

    在一个类中重写hashCode()和equals() package Date_pacage.hash; public class Student { private int grade; priva ...

  4. Java 哈希表运用-LeetCode 1 Two Sum

    Given an array of integers, find two numbers such that they add up to a specific target number. The ...

  5. java哈希表(线性探测哈希表。链式哈希表)

    哈希表(散列表) 通过哈希函数使元素的存储位置与它 的关键码之间能够建立一一映射的关系,在查找时可以很快找到该元素. 哈希表hash table(key,value) 的做法其实很简单,就是把Key通 ...

  6. Java 哈希表

    public int firstUniqChar(String s){ int[] freq=new int[26]; for(int i=0;i<s.length();i++){ freq[s ...

  7. 【LeetCode】哈希表 hash_table(共88题)

    [1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target ...

  8. 【算法】哈希表的诞生(Java)

    参考资料 <算法(java)>                           — — Robert Sedgewick, Kevin Wayne <数据结构>       ...

  9. Java数据结构和算法 - 哈希表

    Q: 如何快速地存取员工的信息? A: 假设现在要写一个程序,存取一个公司的员工记录,这个小公司大约有1000个员工,每个员工记录需要1024个字节的存储空间,因此整个数据库的大小约为1MB.一般的计 ...

随机推荐

  1. Codeforces ECR86 C. Yet Another Counting Problem(规律,区间)

    题意:给你两个正整数a和b,询问q次,每次给你一个区间[l,r],问[l,r]中有多少数字满足:x%a%b!=a%b%a. 题解:看公式无从下手的题,一般都是要找规律的.首先,我们知道,假如x%a%b ...

  2. SPF POJ - 1523 割点+并查集

    题意: 问你这个图中哪个点是割点,如果把这个点去掉会有几个子网 代码: 1 //给你几个点,用着几个点形成了一个图.输入边形成的图,问你这个图中有多少个割点.每一个割点去掉后会形成几个强连通分量 2 ...

  3. Python3.9.1中如何使用match方法?

    接触编程的朋友都听过正则表达式,在python中叫re模块,属于文字处理服务里面的一个模块.re里面有一个方法叫match,接下来的文章我来详细讲解一下match. 作为新手,我建议多使用帮助文档,也 ...

  4. net core启动报错Unable to configure HTTPS endpoint. No server certificate was specified

    这是因为net core2.1默认使用的https,如果使用Kestrel web服务器的话没有安装证书就会报这个错 其实仔细看他的错误提示,其中有一句叫你执行一个命令安装证书的语句: dotnet ...

  5. 要想用活Redis,Lua脚本是绕不过去的坎

    前言 Redis 当中提供了许多重要的高级特性,比如发布与订阅,Lua 脚本等.Redis 当中也提供了自增的原子命令,但是假如我们需要同时执行好几个命令的同时又想让这些命令保持原子性,该怎么办呢?这 ...

  6. Leetcode(26)-删除排序数组中的重复项

    给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. 我们利用 ...

  7. 51nod1459 带权最短路

    1459 迷宫游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 你来到一个迷宫前.该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分 ...

  8. acm 快速傅里叶变换的理解

    A(x)=A4[0](x*x)+x*A4[1](x*x);x=1,w,w*w,w*w*wwi means w^in=4;w=w[4]result shuould bey[0]=A4[0](1*1)+1 ...

  9. web effects collection

    web effects collection typewriter effect js 打字机效果 http://www.mattboldt.com/demos/typed-js/ https://g ...

  10. how to write string to file in bash

    how to write string to file in bash https://stackoverflow.com/questions/22713667/shell-script-how-to ...