首页 > 其他分享 >面试经典 150 题 (十三)

面试经典 150 题 (十三)

时间:2024-02-07 14:56:21浏览次数:19  
标签:150 return val int list mapping 面试 经典 public

先来个大的

class RandomizedSet {
    private HashSet<Integer> hashSet;

    public RandomizedSet() {
        hashSet = new HashSet<Integer>();
    }
    
    public boolean insert(int val) {
        if(hashSet.contains(val)){
            return false;
        }
        hashSet.add(val);
        return true;
    }
    
    public boolean remove(int val) {
        return hashSet.remove(val);
    }
    
    public int getRandom() {
        int k=(int)(Math.random()*hashSet.size());
        int i=0;
        for(Integer a: hashSet){
            if(i==k){return a.intValue();}
            i++;
        }
        return 0;
    }
}

笑稀了

变长数组和哈希表组合,变长数组用于存储数组元素,哈希表用于存储元素和下标的键值对,可以O(1)直接找到值的下标

class RandomizedSet {
    //使用变长数组存储元素,使用HashMap存储元素所在数组中的下标
    HashMap<Integer,Integer> mapping;
    List<Integer> list;
    Random random;

    public RandomizedSet() {
        mapping = new HashMap<Integer, Integer>();
        list = new ArrayList<Integer>();
        random = new Random();
    }
    
    public boolean insert(int val) {
        //需要快速判断当前插入元素是否存在
        if(mapping.containsKey(val)){   //mapping.containsKey()时间复杂度是O(1)
            return false;
        }
        list.add(val);
        mapping.put(val,list.size() - 1);
        return true;
    }
    
    public boolean remove(int val) {
        //需要快速判断当前删除元素是否存在
        if(mapping.containsKey(val)){
            int index = mapping.get(val);//获取当前元素在list中的下标

            //将list中的最后一个元素和下标为index的元素交换位置

            mapping.remove(val);//mapping.remove()时间复杂度是O(1)

            list.set(index, list.get(list.size() - 1));
            
            mapping.replace(list.get(index),index);
            list.remove(list.size() - 1);//删除的时间复杂度是O(n),但是删除最后一个元素的时间复杂度是O(1)  
            
            return true;
        }
        return false;
    }
    
    public int getRandom() {
        int randomIndex = random.nextInt(list.size());
        return list.get(randomIndex);
    }
}

标签:150,return,val,int,list,mapping,面试,经典,public
From: https://www.cnblogs.com/poteitoutou/p/18010795

相关文章

  • 【面试突击】网络通信面试实战
    网络通信面试实战Socket工作原理Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口,其实就是一个门面模式,将底层复杂的通信操作给封装起来对外提供接口。简单来说就是Socket把TPC/IP协议给封装了起来,我们的程序进行网络通信都是通过Socket来完成的!也就是说当......
  • 面试经典 150 题 (十二)
    排序,i代表至少发表的论文数量时间复杂度:O(nlogn)空间复杂度:O(logn)classSolution{publicinthIndex(int[]citations){//01356intlength=citations.length;Arrays.sort(citations);inth=0;for(inti=1......
  • 解锁阿里巴巴面试题:创建线程的几种方式?
    大家好,我是小米!今天我们来聊一个热门话题——阿里巴巴面试题:创建线程的几种方式。在技术的海洋中,线程是我们编程航程中的一艘不可或缺的船,驶向程序的未知领域。那么,究竟有哪些方式可以创建线程呢?让我们一起揭开这个技术的神秘面纱!实现Runnable接口首先,我们来说说最常见、最推荐的方......
  • 经典Prompt欣赏 - Video Script Generator 视频脚本生成器
    体验可以通过https://chat.openai.com/g/g-rxlwmrnqa-video-script-generator地址体验,它将按照你的主题要求,创建TikTok视频脚本。PromptYouareanexpertinthefieldoftopic,whowantstocreateengagingandinformativecontentforTikTok.Youraudienceconsi......
  • 经典Prompt欣赏 - Video Script Generator 视频脚本生成器
    体验可以通过https://chat.openai.com/g/g-rxlwmrnqa-video-script-generator地址体验,它将按照你的主题要求,创建TikTok视频脚本。PromptYouareanexpertinthefieldoftopic,whowantstocreateengagingandinformativecontentforTikTok.Youraudienceconsi......
  • 春节经典诗词祝福语快记到手机便签里
    随着春节的临近,我们纷纷为如何表达对亲朋好友的美好祝愿而烦恼。在这个时刻,古诗词中蕴含着丰富而高级的祝福语文案,成为我们发祝福语或春节文案的灵感源泉。关于春节的经典诗词有很多,这其中蕴含的祝福语文案也颇具深意。为了便捷地找到这些珍贵的春节诗句,我们可以利用网络搜索“春......
  • C语言解题 || 公务员面试
    题目:公务员面试现场打分。有7位考官,从键盘输入若干组成绩,每组7个分数(百分制),去掉一个最分和一个最低分,输出每组的平均成绩。(注:本题有多组输入)输入描述:每一行,输入7个整数(0~100),代表7个成绩,用空格分隔。输出描述:每一行,输出去掉最高分和最低分的平均成绩,小数点后保留2位......
  • 面试经典:Java中list set map之间的区别
    前言大家好,我是chowley,最近正在复习Java集合,这次来总结一下list、set、map它们三个之间的区别。1.List(列表)定义:List是一种有序集合,允许存储重复元素,每个元素都有一个索引,可以按照插入顺序获取。特点:允许存储重复元素。有序集合,保留元素的插入顺序。可以通过索引访问元素。常见实现......
  • 经典数据结构题目-图
    图200.岛屿数量思路遍历二维数组,遇到等于1的进行计算。同时修改同岛的位置为0,避免重复计算遍历同岛的位置,可以采用dfs深度优先搜索代码char[][]g;publicintnumIslands(char[][]grid){intsum=0;g=grid;for(inti=0;......
  • 面试经典 150 题 (十一)
    classSolution{publicintjump(int[]nums){if(nums.length<=1)return0;//记录每次起跳所能跳到的最远的距离intfarestIndex=0;intmaxIndex=0;intstart=0;inttimes=0;while(true){......