假设我们要创建一个支持某些操作的数据结构,这些操作必须在O(1)的时间内执行。所以让这些操作像-
insert(x):将x插入集合
remove(x):从集合中删除x
getRandom():这将找到该集合的随机元素形式。
为了解决这个问题,我们将遵循以下步骤-
制作一个数组
制作一张映射
定义一个函数insert()
,将需要val,
ret:=当val不在m中时
在m [val]的末尾插入nums的大小
在数字末尾插入{val,m [val] – 1}的大小对
返回ret
定义一个函数remove()
,将需要val,
ret:=当val不在m中时
如果ret不为零,则-
从m删除val
last = nums的最后一个元素
m [last键] [last值]:= m [val]的最后一个元素
nums [[m [val]]的最后一个元素:=最后一个
从m [val]删除最后一个元素
如果m [val]为空,则-
从num中删除最后一个元素
返回ret
定义功能 getRandom()
从集合中返回一个随机元素
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class RandomizedCollection { public: vector <pair <int, int>> nums; unordered_map <int, vector<int>> m; RandomizedCollection() { } bool insert(int val) { bool ret = m.find(val) == m.end(); m[val].push_back(nums.size()); nums.push_back({val, m[val].size() - 1}); return ret; } bool remove(int val) { bool ret = m.find(val) != m.end(); if(ret){ pair <int, int> last = nums.back(); m[last.first][last.second] = m[val].back(); nums[m[val].back()] = last; m[val].pop_back(); if(m[val].empty())m.erase(val); nums.pop_back(); } return ret; } int getRandom() { return nums[rand() % nums.size()].first; } }; main(){ RandomizedCollection ob; ob.insert(10); ob.insert(35); ob.insert(20); ob.insert(40); cout << (ob.getRandom()) << endl; ob.remove(20); cout << (ob.getRandom()) << endl; }
Insert 10, 35, 20, 40, then get one random number, say 40, then remove 20, again get random element, that is say 35.
输出结果
40 35
我有两个表,它们的关系如下图所示 我创建了Hibernate数据模型,如下所示 我打算创建如下实体 当我运行这个时,我得到以下错误 org.hibernate.MappingException:实体映射中的重复列:*。SSI 列:CLIENT_ID(应使用 insert=“false” update=“false”进行映射) 如果我设置为CLIENT_ID,它将再次错误关于插入的混合 如果我为所有
该程序将两个元素都添加到Set中。起初我很震惊,因为在向set添加方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后它没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc表示,它在向集合中添加时只检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为一个HashMap,在这个map中,对象的hashCode被用作键。
问题内容: 我正在使用Java,并且试图从某个http链接获取XML文档。我使用的代码是: 不要关注,它是一些特殊的类,就像常规输入流一样。 使用上面的代码,有时会出错。我认为这与xml格式错误有关,但我不知道如何解决。 问题答案: 我将我的评论转为答案,因此它可以被接受,并且这个问题不再悬而未决。 造成这种情况的最可能原因是格式错误的响应,其中包括在initial之前的字符。因此,请查看通过HT
问题内容: 该程序将两个元素都添加到集合中。起初我很震惊,因为在添加设置方法时,调用了equals方法。 但是后来我覆盖了hashCode方法: 然后没有添加。这是令人惊讶的,因为Set和add()方法的Javadoc说它在添加到Set中时仅检查equals()。 这是add()的javadoc: 然后我意识到HashSet被实现为HashMap,并且在地图中,对象的hashCode用作键。因此,
问题内容: 我似乎无法使实例正常工作。我使用的代码如下: 子类 该代码输出 问题答案: 您需要覆盖。而不是这样做,您实现了一个带有signature 的方法。因此,您使用的是为相等性测试定义的默认方法。 默认实现基于对象标识,因此,该集合“允许”您添加两个在语义上相等的不同对象。
这里是Java/C开发者。试图学习C语言,但我对数组的内存分配感到困惑。 这里发生了什么? 输出 怎么会这样?为什么我不能越界异常或程序崩溃?我能无限地做到这一点吗?在这种情况下,我的数组长度是多少?如果我的数组允许我将值放在界限之外,那么通过分配内存有什么意义?这对我来说毫无意义。