zoukankan      html  css  js  c++  java
  • 设计一种结构,在该结构中有如下三个功能:insert(key):将某个key加入到该结构,做到不重复加入。delete(key):将原本在结构中的某个key移除。 getRandom():等概率随机返回结构中的任何一个key。【要求】 Insert、delete和getRandom方法的时间复杂度都是 O(1)

    解题思路:
    创建hashmap,一个存K,数字,另一个存数字,K,每当插入元素时,将元素非别对应插入两个hashmap中
    目的是能够方变随机查找。
    public class RandomPool {
    public static class Pool<K>{
    private HashMap<K,Integer> keyIndexMap;
    private HashMap<Integer,K> indexKeyMap;
    private int size;
    public Pool(){
    keyIndexMap = new HashMap<>();
    indexKeyMap = new HashMap<>();
    size = 0;
    }
    public void insert(K key){
    if(!keyIndexMap.containsKey(key)){
    keyIndexMap.put(key,size);
    indexKeyMap.put(size++,key);
    }

    }
    // A 0 0 A
    // B 1 1 B
    //C 2 2 C
    //D 3 3 D
    //先确定删除的索引,以及最后面的值,把最后面的值补充到删除的地方
    //之后删除开始应该删除的
    public void delete(K key){
    if(keyIndexMap.containsKey(key)){
    int deleteIndex = keyIndexMap.get(key);
    int lastIndex = --size;
    K lastKey = indexKeyMap.get(lastIndex);
    keyIndexMap.put(lastKey,deleteIndex);
    indexKeyMap.put(deleteIndex,lastKey);
    keyIndexMap.remove(key);
    indexKeyMap.remove(lastIndex);
    }
    }
    public K random(){
    if(size==0){
    return null;
    }
    int num = (int) (Math.random()*size);
    return indexKeyMap.get(num);
    }
    }
    }
    总结:多积累。
  • 相关阅读:
    ThetaSome_ThetaAll子查询
    BMP文件解析
    IN-子查询
    由顶点坐标计算任意多边形面积
    Java入门——多态
    使用Notepad++开发Java程序
    C#利用VUDP.cs开发网络通讯应用例程
    C#利用Vini.cs操作INI文件
    RC522射频卡读写模块驱动(仅读取)
    Tupper自我指涉公式生成器
  • 原文地址:https://www.cnblogs.com/liuwentao/p/9404305.html
Copyright © 2011-2022 走看看