首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >求职面试算法?

求职面试算法?
EN

Stack Overflow用户
提问于 2020-11-07 15:31:39
回答 2查看 162关注 0票数 0

更新:有人能回答我对n.‘代词’‘m.’‘的回答的最后一个评论吗?

请注意:,我以前问过这个问题,但它是一个完整的混乱,所以我用更多的细节和原始的形式写它。

问题:

我正在管理一个N个参与者之间的投票系统(每个参与者的索引从1到N),其中我想支持以下功能:

  1. 初始化数据结构。-O(1)
  2. 投票(j,i) -在结果表中添加一个人的投票结果表(准确地说是1)给第一人--在那里不允许某人自己投票。-O(1)
  3. 投票者(I)-返回投票给i. -O的人数(1)
  4. 原点(J)-把j给别人的票数还给别人。-O(1)
  5. 得票率(K)--根据得票的数量(按降序排列)打印最高的参与者。-O(k)
  6. 避免()-打印所有没有得到任何投票的参与者。-O(r)其中r是打印的参与者数

在这个问题中,空间复杂度应该是O(N)

只允许使用数组和(双)链接列表.

我做了什么?,我简单地简单地声明了一个数组,它的大小是N,每个单元格都包含值;gotsent。当i投票给j时,j值增加,j值增加,i值增加1。

但我仍然不知道如何在所需的复杂性中解决5和6问题。

注意:,我正在寻找算法/想法,而不是实际的代码。

EN

回答 2

Stack Overflow用户

发布于 2020-11-07 16:40:33

请注意,对于每个操作,被投票支持的候选人的分数增加了整整一个。

这就打开了一个新的策略--而不是将一个候选人映射到它的分数,而是将一个分数映射到有这个分数的候选人列表中。

这可以很简单地实现为列表候选列表:(在模板,如语法:list<list<Candidate>>)。

此外,保持一个数组将每个候选数映射到实际Candidate元素的指针。

0的候选列表将在在O(1)中初始化数组的类似方式中隐式地设置为所有候选人。

  • 投票时:
  1. 你可以从推荐信中找到候选人: O(1)
  2. 将其从当前列表中删除,并将其添加到下一个列表: O(1)
  3. 要在Avoided()中支持O(r):如果"0“列表中的元素数小于一半,则将其改为常规列表。
  4. 如果表示分数的前一个元素现在没有候选项,则删除它,并将前一个分数直接链接到下一个得分(即,如果没有得分为3的候选元素,请连接2<->4),这将确保O(n)空间,因为没有太多的空列表节点。
  • 获得topK现在很容易,并且在O(k)中通过逐个迭代分数列表来完成(在输出k考生之后停止)
  • 如果超过一半的候选项被避免,现在避免的是O(n) = O(r),或者由于插入中的优化(3)而避免使用O(r)
票数 1
EN

Stack Overflow用户

发布于 2020-11-07 17:43:33

这里有一种可供选择的方法来实现Here ()。把两个号码和每一个被投票的人联系起来,开始运行和结束运行。最初,所有元素都被设置为None (可以通过O(1)数组初始化技巧来完成)。

当person m第一次被投票时,更新startOfRunendOfRun数组:

代码语言:javascript
运行
复制
if startOfRun[m-1] != None and startOfRun[m+1] == None
   endOfRun[startOfRun[m-1]] = m
else if startOfRun[m-1] == None and startOfRun[m+1] != None
   startOfRun[endOfRun[m+1]]
else if startOfRun[m-1] != None and startOfRun[m+1] != None
   endOfRun[startOfRun[m-1]] = endOfRun[m+1]
   startOfRun[endOfRun[m+1]] = startOfRun[m-1]
else
   startOfRun[m] = m
   endOfRun[m] = m

(为简洁而省略的边缘条件)。

现在你有很多被投票支持的人,你可以很容易地从一开始到每一次竞选结束。跑中的数字都是错误的,但我们并不在乎它们。有O(r)运行,所以您可以跳过所有在O(r)中投票赞成的人。

下面是实现受宠()的另一种方法。有两个数组,(1)按分数排序的扩展的人员数组,(2)从分数到第一个数组中的最后一个人的索引的映射,其得分不小于该值(如果没有这样的人,则为None)。最初,第一个数组是空的,第二个数组包含None的。

代码语言:javascript
运行
复制
(array 1)
(index)       1 2 3 4 5 6 7 8 9
person        3 6 5 1 4 2 8 9 7
score         7 7 7 5 5 3 2 2 2

(array 2)
score         1 2 3 4 5 6 7 8 9
index in 1st  9 9 6 5 5 3 3 - -

一旦一个人第一次投票,它将被添加到数组的末尾,得分为1,并且更新array2[1]。一旦该人再次被投票,它将与具有相同分数的数组中的第一个人交换,得分增加,第二个数组被更新(我们只需要更新一个元素,对应于新分数的元素)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64729337

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档