-
030. 插入、删除和随机访问都是 O(1) 的容器
-
031. 最近最少使用缓存
-
032. 有效的变位词
-
033. 变位词组
-
034. 外星语言是否排序
-
035. 最小时间差
==========================================================================================
题目:
设计一个支持在平均 时间复杂度 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()];
}
};
=============================================================================
这题做过题解了
===========================================================================
题目:
给定两个字符串 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;
}
};
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
非常完美的教程了。
[外链图片转存中…(img-d5VpSoKu-1712654360026)]
整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~
你的支持,我的动力;祝各位前程似锦,offer不断!!!
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-rYt0zx9l-1712654360027)]