LeetCode 剑指 Offer II 哈希表 专题总结,如何实现分布式锁

  • 030. 插入、删除和随机访问都是 O(1) 的容器

  • 031. 最近最少使用缓存

  • 032. 有效的变位词

  • 033. 变位词组

  • 034. 外星语言是否排序

  • 035. 最小时间差

030. 插入、删除和随机访问都是 O(1) 的容器

==========================================================================================

题目:

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

  • insert(val):当元素 val 不存在时返回 true ,并向集合中插入该项,否则返回 false 。
  • remove(val):当元素 val 存在时返回 true ,并从集合中移除该项,否则返回 false 。
  • getRandom:随机返回现有集合中的一项。每个元素应该有 相同的概率 被返回

示例:

输入: inputs = [“RandomizedSet”, “insert”, “remove”, “insert”, “getRandom”, “remove”, “insert”, “getRandom”]

[[], [1], [2], [2], [], [1], [2], []]

输出: [null, true, false, true, 2, true, false, 2]

解释:

RandomizedSet randomSet = new RandomizedSet(); // 初始化一个空的集合

randomSet.insert(1); // 向集合中插入 1 , 返回 true 表示 1 被成功地插入

randomSet.remove(2); // 返回 false,表示集合中不存在 2

randomSet.insert(2); // 向集合中插入 2 返回 true ,集合现在包含 [1,2]

randomSet.getRandom(); // getRandom 应随机返回 1 或 2

randomSet.remove(1); // 从集合中移除 1 返回 true 。集合现在包含 [2]

randomSet.insert(2); // 2 已在集合中,所以返回 false

randomSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2

思路:

数组存储就可以满足随机访问集合中的任意一项getRandom,用map来访问元素的位置,不然直接用map就可以了,

删除的时候直接将最后一个元素覆盖要删除的元素,这样就解决了数组删除后需要将数组后面元素迁移的复杂度。

class RandomizedSet {

public:

unordered_map<int,int> map;

vector num;

/** Initialize your data structure here. */

RandomizedSet() {

}

/** Inserts a value to the set. Returns true if the set did not already contain the specified element. */

bool insert(int val) {

if(map.count(val) != 0) return false;

map[val] = num.size();

num.push_back(val);

return true;

}

/** Removes a value from the set. Returns true if the set contained the specified element. */

bool remove(int val) {

if(map.count(val) == 0) return false;

map[num.back()] = map[val]; //将删除数的位置赋值给最后一个元素

num[map[val]] = num.back(); //将最后一个元素覆盖到删除数的位置

num.pop_back();

map.erase(val);

return true;

}

/** Get a random element from the set. */

int getRandom() {

return num[rand() % num.size()];

}

};

031. 最近最少使用缓存

=============================================================================

这题做过题解了

【高频面试题】LeetCod 146. LRU 缓存机制

032. 有效的变位词

===========================================================================

题目:

给定两个字符串 s 和 t ,编写一个函数来判断它们是不是一组变位词(字母异位词)。

注意:若 s 和 t 中每个字符出现的次数都相同且字符顺序不完全相同,则称 s 和 t 互为变位词(字母异位词)

示例:

输入: s = “anagram”, t = “nagaram”

输出: true

思路:

因为只有小写字母,直接用数组存储就可以了,也可以用map

要求变位词,即长度一样且不相等

然后记录s的各个字符出现次数,去t中遍历是否出现次数都一样

class Solution {

public:

bool isAnagram(string s, string t) {

if(s == t || s.length() != t.length()) return false;

//if过滤后都是长度想等的

vector vec(26);

for(char& c : s) {

vec[c - ‘a’]++;

}

for(char& c : t) {

if(–vec[c - ‘a’] < 0) {

return false;

}

}

return true;

}

};

033. 变位词组

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。

image

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

非常完美的教程了。

[外链图片转存中…(img-d5VpSoKu-1712654360026)]

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-rYt0zx9l-1712654360027)]

  • 25
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值