哈希表-定义-操作-习题

哈希表

1、定义

哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在O(1)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。

//两种写法都可以
HashMap<数据类型,数据类型> 哈希表名=new HashMap<数据类型,数据类型>()
HashMap<数据类型,数据类型> 哈希表名=new HashMap<>()
// 使用钻石操作符
HashMap<String, Integer> map1 = new HashMap<>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();


2、相关操作

在 Java 中,哈希表通常是通过 HashMap 类来实现的。HashMap 是一个基于哈希表的 Map 接口的实现,它允许存储键值对,并提供快速的查找、插入和删除操作。以下是一些常见的哈希表操作及其示例:

1. 创建 HashMap

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        // 创建一个 HashMap
        HashMap<String, Integer> map = new HashMap<>();
    }
}

2. 插入元素

map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);

3. 获取元素

int age = map.get("Alice"); // 返回 30

4. 检查键是否存在

boolean hasBob = map.containsKey("Bob"); // 返回 true

5. 检查值是否存在

boolean hasValue = map.containsValue(25); // 返回 true

6. 删除元素

map.remove("Charlie"); // 删除键为 "Charlie" 的元素

7. 遍历 HashMap

// 遍历键值对
for (HashMap.Entry<String, Integer> entry : map.entrySet()) {
    System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}

// 遍历键
for (String key : map.keySet()) {
    System.out.println("Key: " + key);
}

// 遍历值
for (Integer value : map.values()) {
    System.out.println("Value: " + value);
}

8. 获取大小

int size = map.size(); // 返回当前 HashMap 中的键值对数量

9. 清空 HashMap

map.clear(); // 清空所有元素

10. 检查是否为空

boolean isEmpty = map.isEmpty(); // 返回 true 如果 HashMap 为空

示例代码

以下是一个完整的示例,展示了上述操作:

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        // 创建一个 HashMap
        HashMap<String, Integer> map = new HashMap<>();

        // 插入元素
        map.put("Alice", 30);
        map.put("Bob", 25);
        map.put("Charlie", 35);

        // 获取元素
        System.out.println("Alice's age: " + map.get("Alice"));

        // 检查键是否存在
        System.out.println("Contains Bob? " + map.containsKey("Bob"));

        // 删除元素
        map.remove("Charlie");
        System.out.println("After removing Charlie: " + map);

        // 遍历 HashMap
        for (HashMap.Entry<String, Integer> entry : map.entrySet()) {
            System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
        }

        // 获取大小和清空 HashMap
        System.out.println("Size of map: " + map.size());
        map.clear();
        System.out.println("Is map empty? " + map.isEmpty());
    }
}

以上代码展示了如何使用 HashMap 进行基本的操作。如果你有其他问题或需要更详细的信息,请告诉我!

3、相关习题

  • 数组中出现次数超过一半的数字
  • 题目描述:给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
  • 实例:
输入:[1,2,3,2,2,2,5,4,2]返回值:2
  • 思考:记录每个数出现的次数,返回次数大于数组长度一半的数。
  • 代码:
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param numbers int整型一维数组 
     * @return int整型
     */
    public int MoreThanHalfNum_Solution (int[] numbers) {
        // write code here
        //创建哈希表
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<numbers.length;i++){
            //将第一次出现的值放入哈希表
            if(!map.containsKey(numbers[i])){
                map.put(numbers[i],1);
            }
            //计数数字出现的次数
            else{
                map.put(numbers[i],map.get(numbers[i])+1);
            }
            if(map.get(numbers[i])>numbers.length/2){
               return numbers[i];
        }
        }
        return 0;
        //判断数字次数出现的值是否大于数组的一般,如果大于,返回值
    }
}

2、数组中只出现一次的数字

  • 描述:一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
  • 实例:
  • 输入:
    [1,4,1,6]
    返回值:[4,6]
    说明:返回的结果中较小的数排在前面
  • 思考:只出现一次的两个数字,需要排序
  • 代码:
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型一维数组
     */
    public int[] FindNumsAppearOnce (int[] nums) {
        // write code here
        //创建哈希表,存放所有数出现的次数,把超过1的数据去除。
       int[] result = new int[2];
       int index = 0;
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(!map.containsKey(nums[i])){
                map.put(nums[i],1);
            }else{
                map.remove(nums[i]);
            }
        }
        //遍历哈希表,取出key
       for (Integer key : map.keySet()) {
            result[index++] = key; // 将找到的数字放入结果数组
        }
        //数组中的两个数排序
        if (result[0] > result[1]) {
            int temp = result[0];
            result[0] = result[1];
            result[1] = temp;
        }

        return result;
    }

    }

3、缺失的第一个正数

  • 描述:给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数
  • 实例:
  • 思考:不考虑小于0的;然后看1,2,3,4,5…那个没有出现,较好的看元素是否出现,用哈希表比较好。
  • 代码:
import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型一维数组 
     * @return int整型
     */
    public int minNumberDisappeared (int[] nums) {
        // write code here
        //创建一个哈希表
        //把所有数存在表里,不存0一下的;
        HashMap<Integer,Integer> map=new HashMap<>();
        for(int i=0;i<nums.length;i++){
            if(nums[i]>0){
                map.put(nums[i],1);
            }
        }
        //遍历所有整数
        int res=1;
        while(map.containsKey(res)){
            res++;
        }
        return res;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值