一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Java代碼實現哈希表(google 公司的上機題)

Java代碼實現哈希表(google 公司的上機題)

2021-08-21 11:12十四14 Java教程

這篇文章主要介紹了Java 哈希表詳解(google 公司的上機題),本文通過圖文實例相結合給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

1 哈希表(散列)-Google 上機題

1) 看一個實際需求,google 公司的一個上機題:
2) 有一個公司,當有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,住址..),當輸入該員工的 id 時,要求查
找到該員工的 所有信息.
3) 要求: 不使用數據庫,盡量節省內存,速度越快越好=>哈希表(散列)

2 哈希表的基本介紹

散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通
過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組
叫做散列表。

Java代碼實現哈希表(google 公司的上機題)

3. google 公司的一個上機題:

有一個公司,當有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,名字,住址..),當輸入該員工的 id 時,
要求查找到該員工的 所有信息.
要求:
  1) 不使用數據庫,,速度越快越好=>哈希表(散列)
  2) 添加時,保證按照 id 從低到高插入
  3) 使用鏈表來實現哈希表, 該鏈表不帶表頭[即: 鏈表的第一個結點就存放雇員信息]
  4) 思路分析并畫出示意圖

Java代碼實現哈希表(google 公司的上機題)

  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. }

Java代碼實現哈希表(google 公司的上機題)

Java代碼實現哈希表(google 公司的上機題)

注意:不要把鏈表的第一個節點(頭節點)刪除了,不然整條鏈表沒了。(還可以改良)

思考:如果 id 不是從低到高插入,但要求各條鏈表仍是從低到高,怎么解決?

到此這篇關于Java 哈希表(google 公司的上機題)的文章就介紹到這了,更多相關java哈希表內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/linzm14/archive/2021/03/07/14495883.html

延伸 · 閱讀

精彩推薦
  • Java教程java操作mysql實現增刪改查的方法

    java操作mysql實現增刪改查的方法

    這篇文章主要介紹了java操作mysql實現增刪改查的方法,結合實例形式分析了java操作mysql數據庫進行增刪改查的具體實現技巧與相關注意事項,需要的朋友可以...

    Flying_tao2492020-09-22
  • Java教程Spring基礎篇之初識DI和AOP

    Spring基礎篇之初識DI和AOP

    這篇文章主要為大家詳細介紹了Spring基礎篇之初識DI和AOP,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    陳本布衣4792021-03-13
  • Java教程詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

    詳解Spring Boot工程集成全局唯一ID生成器 UidGenerator的操作步驟

    本文就在項目中來集成 UidGenerator這一工程來作為項目的全局唯一 ID生成器。接下來通過實例代碼給大家詳解詳解Spring Boot工程集成全局唯一ID生成器 UidGen...

    王 帥10062021-06-08
  • Java教程SpringBoot JPA實現查詢多值

    SpringBoot JPA實現查詢多值

    這篇文章主要為大家詳細介紹了SpringBoot JPA實現查詢多值,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    零晨三點半4762021-05-28
  • Java教程Java基于Socket的文件傳輸實現方法

    Java基于Socket的文件傳輸實現方法

    這篇文章主要介紹了Java基于Socket的文件傳輸實現方法,結合實例分析了Java使用Socket實現文件傳輸的建立連接、發送與接收消息、文件傳輸等相關技巧,需要的...

    wiseideal3062020-03-07
  • Java教程淺談Java中的參數傳遞問題

    淺談Java中的參數傳遞問題

    這篇文章主要介紹了Java中的參數傳遞問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小...

    lixue_yang4382021-07-30
  • Java教程詳解Java實現負載均衡的幾種算法代碼

    詳解Java實現負載均衡的幾種算法代碼

    本篇文章主要介紹了詳解Java實現負載均衡的幾種算法代碼 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    魔流劍3612020-08-06
  • Java教程用Java實現希爾排序的示例

    用Java實現希爾排序的示例

    問題:現有一段程序S,可以對任意n個數進行排序。如果現在需要對n^2個數進行排序,最少需要調用S多少次?只允許調用S,不可以做別的操作。我們用希爾...

    java教程網4252019-10-20
主站蜘蛛池模板: 青青青久在线视频免费观看 | 国产在线精品香蕉综合网一区 | 国产午夜精品一区二区三区不卡 | 国产成人精品一区二三区2022 | 久久久影院亚洲精品 | 精品国产免费第一区二区 | 国产高清不卡码一区二区三区 | 亚洲视频在线一区二区三区 | 国产xx肥老妇视频奂费 | 国产一区二区三区丶四区 | 操儿子 | 国产免费资源 | 成年人在线视频免费观看 | 果冻传媒九一制片厂网站 | 波多野结衣中文字幕在线 | 白丝捆绑vk| 国产成人精品一区二区阿娇陈冠希 | 国产亚洲精品福利在线 | 丝袜兔女郎被啪在线观看91 | 精品综合久久久久久8888 | 插入逼| 幻女free性俄罗斯第一次摘花 | 99精品国产成人a∨免费看 | h动态图男女啪啪27报 | 性做久久久久免费观看 | 肉文np高h | 成人精品亚洲人成在线 | 国产精品久久现线拍久青草 | 91视频国产自拍 | 国产在视频线精品视频 | 波多野结衣久久国产精品 | 免费特黄一区二区三区视频一 | 精品国产日韩一区三区 | 久久99热狠狠色AV蜜臀 | 激情三级hd中文字幕 | 日韩欧美一区二区三区免费看 | 四虎免费影院ww4164h | 3d动漫美女被吸乳羞羞视频 | 99亚洲视频| 精品久久一 | 欧美日韩人成在线观看 |