每天一道Rust-LeetCode(2019-06-14) 常数时间插入、删除和获取随机元素

坚持每天一道题,刷题学习Rust.

题目描述

https://leetcode-cn.com/problems/insert-delete-getrandom-o1/

设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。

insert(val):当元素 val 不存在时,向集合中插入该项。

remove(val):元素 val 存在时,从集合中移除该项。

getRandom:随机返回现有集合中的一项。每个元素应该有相同的概率被返回。

示例 :

// 初始化一个空的集合。

RandomizedSet randomSet = new RandomizedSet();

// 向集合中插入 1 。返回 true 表示 1 被成功地插入。

randomSet.insert(1);

// 返回 false ,表示集合中不存在 2 。

randomSet.remove(2);

// 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。

randomSet.insert(2);

// getRandom 应随机返回 1 或 2 。

randomSet.getRandom();

// 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。

randomSet.remove(1);

// 2 已在集合中,所以返回 false 。

randomSet.insert(2);

// 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。

randomSet.getRandom();

解题过程

思路:1.用slice存值,用map保存值在slice中的index;

2.每次删除时,为了避免移动元素,用数组末尾元素覆盖需要删除的元素,然后删除数组末尾元素;

extern crate rand;
use rand::Rng;
use std::collections::HashMap;
use std::collections::HashSet;
struct RandomizedSet {
m: HashMap<i32, usize>,
v: Vec<i32>,
} /**
* `&self` means the method takes an immutable reference.
* If you need a mutable reference, change it to `&mut self` instead.
*/
impl RandomizedSet {
/** Initialize your data structure here. */
fn new() -> Self {
RandomizedSet {
m: HashMap::new(),
v: Vec::new(),
}
} /** Inserts a value to the set. Returns true if the set did not already contain the specified element. */
pub fn insert(&mut self, val: i32) -> bool {
if self.m.contains_key(&val) {
return false;
}
let i = self.m.len();
if self.v.len() > i {
//经过删除以后v里面空间可能非常富裕,直接用现有的才对
self.v[i] = val;
} else {
self.v.push(val);
}
self.m.insert(val, i);
return true;
} /** Removes a value from the set. Returns true if the set contained the specified element. */
pub fn remove(&mut self, val: i32) -> bool {
if !self.m.contains_key(&val) {
return false;
}
let i = *self.m.get(&val).expect("must ok");
if i != self.m.len() - 1 {
//如果是最后一个,就不用调整了
self.v[i] = self.v[self.m.len() - 1]; //最后一个值填充到i
self.m.insert(self.v[i], i);
}
self.m.remove(&val);
return true;
} /** Get a random element from the set. */
pub fn get_random(&self) -> i32 {
let mut rng = rand::thread_rng();
let mut i: usize = rng.gen();
i = i % self.m.len();
return self.v[i];
}
}

一点感悟

rust标准库中居然没有随机数生成器.

其他

欢迎关注我的github,本项目文章所有代码都可以找到.

每天一道Rust-LeetCode(2019-06-14)的更多相关文章

  1. http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html

    http://www.cnblogs.com/huangcong/archive/2010/06/14/1757957.html http://www.cnblogs.com/langtianya/a ...

  2. 每日一练ACM 2019.04.14

    2019.4.14 第1001题:Sum Problem Problem DescriptionHey, welcome to HDOJ(Hangzhou Dianzi University Onli ...

  3. BlackArch Linux 2019.06.01 宣布发布

    导读 BlackArch Linux是一个基于Arch Linux的发行版,专为渗透测试人员和安全研究人员设计,并包含大量渗透测试和安全实用程序,已宣布发布2019.06.01版本. BlackArc ...

  4. [每日一题2020.06.14]leetcode #70 爬楼梯 斐波那契数列 记忆化搜索 递推通项公式

    题目链接 题意 : 求斐波那契数列第n项 很简单一道题, 写它是因为想水一篇博客 勾起了我的回忆 首先, 求斐波那契数列, 一定 不 要 用 递归 ! 依稀记得当年校赛, 我在第一题交了20发超时, ...

  5. 黄聪:如何使用CodeSmith批量生成代码(转:http://www.cnblogs.com/huangcong/archive/2010/06/14/1758201.html)

    先看看CodeSmith的工作原理: 简单的说:CodeSmith首先会去数据库获取数据库的结构,如各个表的名称,表的字段,表间的关系等等,之后再根据用户自定义好的模板文件,用数据库结构中的关键字替代 ...

  6. 2014.06.14 GlusterFS技术交流视频

    6月14线下GlusterFS视频交流.高清视频是非常好的,我初听言论方面,谈到迅速,似乎不是很清楚,讲座结束后速度需要改进.谢谢能力的天空AbleSky高大内设,谢谢学生参加. 在线公开课:http ...

  7. Murano Weekly Meeting 2016.06.14

    Meeting time: 2016.June.14 1:00~2:00 Chairperson:  Kirill Zaitsev, from Mirantis Meeting summary: 1. ...

  8. 2019.03.14 ZJOI2019模拟赛 解题报告

    得分: \(100+100+0=200\)(\(T1\)在最后\(2\)分钟写了出来,\(T2\)在最后\(10\)分钟写了出来,反而\(T3\)写了\(4\)个小时爆\(0\)) \(T1\):风王 ...

  9. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

  10. leetCode练题——14. Longest Common Prefix

    1.题目 14. Longest Common Prefix   Write a function to find the longest common prefix string amongst a ...

随机推荐

  1. Vue indent eslint缩进webstorm冲突解决

    参考教程 官方回复 ESlint设置 rules: { 'no-multiple-empty-lines': [1, {max: 3}], // 控制允许的最多的空行数量 'vue/script-in ...

  2. A1101 Quick Sort (25 分)

    一.技术总结 这里的一个关键就是理解调换位置排序是时,如果是元主,那么它要确保的条件就只有两个一个是,自己的位置不变,还有就是前面的元素不能有比自己大的. 二.参考代码 #include<ios ...

  3. zz错误集锦

    1.csp-s模拟测试63 T1 2e8的数组开bitset会ce,开bool就可以了,bool一位占一个字节,不是四个字节 2.csp-s模拟测试65 T2 把用vector存图改成前向星,就A了, ...

  4. Window权限维持(五):屏幕保护程序

    屏幕保护是Windows功能的一部分,使用户可以在一段时间不活动后放置屏幕消息或图形动画.众所周知,Windows的此功能被威胁参与者滥用为持久性方法.这是因为屏幕保护程序是具有.scr文件扩展名的可 ...

  5. LeetCode 1290. Convert Binary Number in a Linked List to Integer

    题目 /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListN ...

  6. 关于如何提高缓存命中率(redis)

    一.缓存命中率的介绍 命中:可以直接通过缓存获取到需要的数据. 不命中:无法直接通过缓存获取到想要的数据,需要再次查询数据库或者执行其它的操作.原因可能是由于缓存中根本不存在,或者缓存已经过期. 通常 ...

  7. abstract,virtual,override

    1.abstract 可以修饰类和方法,修饰方法时只声明不实现: 2.继承实现abstract类必须通过override实现abstract声明的方法,而virtual方法可选择override(重写 ...

  8. ABP中文网的一些BUG

    之前一些翻译了的文档没有及时更新.比如 IAsyncCrudAppService接口在很久之前的版本就已经改为了ICrudAppService,如果是在官网下载的最新实例中IAsyncCrudAppS ...

  9. 面向对象的六大原则之 单一职责原则——SRP

    SRP = Single Responsibility Principle   定义:就一个类而言,应该只有一个能引起他变化的原因.通俗的说,即一个类只负责一项职责.   作用: 1.减少了类之间的耦 ...

  10. 表单验证如何让select设置为必选

    <select class="custom-select mr-sm-2" name="province" id="province" ...