380. O(1) 时间插入、删除和获取随机元素 / 182. 查找重复的电子邮箱 / 1050. 合作过至少三次的演员和导演 / 1587. 银行账户概要 II / 1084. 销售分析III

380. O(1) 时间插入、删除和获取随机元素【中等题】【每日一题】

思路:

通过hashmap来确定插入和删除元素时是否集合中已经存在重复元素。
通过int数组存放集合元素来实现对元素的随机获取(通过随机获取元素对应的下标来随机获取元素)。

代码:

class RandomizedSet {

    static int[] nums;//存放元素,通过元素的有序存储来实现根据下标随机取出
    Random random;//随机对象
    Map<Integer,Integer> map;//通过hashmap来保证元素的唯一性
    int index;//数组下标

    public RandomizedSet() {//构造函数初始化参数
        this.nums = new int[200000];
        this.random = new Random();
        this.map = new HashMap<>();
        this.index = -1;
    }
    
    public boolean insert(int val) {
        if(map.containsKey(val)){//如果map中存在当前元素,则插入失败,返回false
            return false;
        }else{
            map.put(val,++index);//将当前元素存入map,值为index先自增1代表在nums中的下标
            nums[index] = val;//在nums数组对应index位置存入当前元素
            return true;//插入成功,返回true
        }
    }
    
    public boolean remove(int val) {
        if(!map.containsKey(val)){//如果map中不存在当前元素,则删除失败,返回false
            return false;
        }else{
            int cur = map.remove(val);//删除当前元素并将当前元素对应的nums下标取出
            if(cur != index){//如果当前元素下标不是nums数组最后一个有效下标
                //说明删除的元素在nums数组有效右边界左侧,因此需要将map中对应nums有效右边界位置的元素对应的数组下标更新为刚刚删除的下标位置
                map.put(nums[index],cur);
            }
            //如果当前元素下标是nums数组最后一个有效下标,则不用上一步操作
            nums[cur] = nums[index--];//将nums有效右边界元素更新到cur位置,并将index自减1表示nums数组有效右边界左移1位
            return true;//删除成功,返回true
        }
    }
    
    public int getRandom() {
        return nums[random.nextInt(index+1)];//返回[0,index]返回内的int类型随机数对应的nums下标位置的元素
    }
}

/**
 * Your RandomizedSet object will be instantiated and called as such:
 * RandomizedSet obj = new RandomizedSet();
 * boolean param_1 = obj.insert(val);
 * boolean param_2 = obj.remove(val);
 * int param_3 = obj.getRandom();
 */

182. 查找重复的电子邮箱【简单题】

在这里插入图片描述

代码:

# Write your MySQL query statement below
select Email
from Person
group by Email
having count(Email) > 1;

1050. 合作过至少三次的演员和导演【简单题】

在这里插入图片描述
在这里插入图片描述
代码:

# Write your MySQL query statement below
select actor_id,director_id
from ActorDirector
group by actor_id,director_id
having count(`timestamp`) >= 3;

1587. 银行账户概要 II【简单题】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

# Write your MySQL query statement below
select u.name as `NAME`,sum(t.amount) as `BALANCE`
from Transactions t left join Users u
on t.account = u.account
group by t.account
having BALANCE > 10000;

1084. 销售分析III【简单题】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码:

# Write your MySQL query statement below
select s.product_id,product_name # ,s.sale_date
from Product p left join Sales s
on p.product_id = s.product_id
group by s.product_id
having min(sale_date) >= '2019-01-01' and max(sale_date) <= '2019-03-31' # 先筛选,再select展示
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值