LeetCode 剑指 Offer II 哈希表 专题总结

蜂信物联FastBee平台https://gitee.com/beecue/fastbee

阿里资料开源项目https://gitee.com/vip204888

百度低代码前端框架https://gitee.com/baidu/amis

OpenHarmony开源项目https://gitcode.com/openharmony

仓颉编程语言开放项目https://gitcode.com/Cangjie

  • 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. 变位词组

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

题目:

给定一个字符串数组 strs ,将 变位词 组合在一起。 可以按任意顺序返回结果列表。

注意:若两个字符串中每个字符出现的次数都相同,则称它们互为变位词。

示例:

输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]

输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]

思路:

排序每一个字符串,然后判断是否出现过,

出现过直接添加在该行后面

否则新增一行且添加在行首

class Solution {

public:

vector<vector> groupAnagrams(vector& strs) {

vector<vector> vec;

unordered_map<string, int> map;

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

image

Java面试精选题、架构实战文档

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

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

总结

对于面试还是要好好准备的,尤其是有些问题还是很容易挖坑的,例如你为什么离开现在的公司(你当然不应该抱怨现在的公司有哪些不好的地方,更多的应该表明自己想要寻找更好的发展机会,自己的一些现实因素,比如对于我而言是现在应聘的公司离自己的家更近,又或者是自己工作到达了迷茫期,想跳出迷茫期等等)

[外链图片转存中…(img-ZOtQRHuE-1725192875561)]

Java面试精选题、架构实战文档

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值