当前位置: 首页 > 知识库问答 >
问题:

在给定的开始时间和持续时间内查找任务结束顺序的算法

宦飞
2023-03-14

我最近参加了一个面试,有人问我这个问题:

给定数组中的开始时间:[1,2,3,2]及其持续时间[3,4,4,3]

查找并返回任务完成的顺序。对于这个例子,结束时间是:[4,6,7,5],所以返回的值应该是[1,3,4,2]

我的方法/解决方案:

创建一个数据结构,将每个类表示为具有以下属性的任务对象:

  1. 开始时间
  2. 结束时间
  3. 持续时间
  4. 完成索引

然后根据每个对象的结束时间对数组进行排序。将每个元素与原始数组索引进行比较,并按原始任务顺序返回finish索引。

请提出更好的解决方案。在面试中(使用白板和记号笔),如果没有错误,很难实现这种方法。如果没有更好的解决方案,最简单的方法是什么。更好的解决方案=更好的时间复杂性。

共有3个答案

呼延宪
2023-03-14

最简单快捷的解决方案

创建两个阵列:

最终时间数组:[4,6,7,5]

索引数组:[0,1,2,3]

使用快速排序对最终时间数组进行排序(或者插入排序,如果可以确定,数组将非常小=小于10个数字),每当切换最终时间数组元素时,也要切换索引数组。

当finaltime排序时,索引数组保存结果。

司马羽
2023-03-14

假设您的原始集合(如数组)创建如下(显然是伪代码):

create collection first[] with elements (starttime, duration)
first.append (1, 3)
first.append (2, 4)
first.append (3, 4)
first.append (2, 3)

这将为您提供(开始时间,持续时间)元组first=[(1,3), (2,4), (3,4), (2,3)]的集合。

然后,你可以用一个单独的结构来做你想做的事情,这个结构只包含两件事情:

  • 该指数反映了当前的结构

首先,填充这个新结构的数组second,使索引与原始数组first匹配,如下所示:

create array second[] with elements (firstindex, endtime)
for each index in first.indexes:
    second.append (index, first[index].starttime + first[index].duration)

这将为您提供(firstindex,endtime)元组的集合second=[(1,4)、(2,6)、(3,7)、(4,5)](这里我们假设集合是基于一而不是基于零的)。

然后根据结束时间对second数组进行排序,得到second=[(1,4)、(4,5)、(2,6)、(3,7)]

然后,您可以在完成顺序的任务代码如下:

for each index in second.indexes:
    output "task # ", second[index].firstindex
    output " starts at, " first[second[index].firstindex].starttime
    output " duration, " first[second[index].firstindex].duration
    output " ends at ", second[index].endtime, new-line

其结果将是:

task # 1 starts at 1 duration 3 ends at 4
task # 4 starts at 2 duration 3 ends at 5
task # 2 starts at 2 duration 4 ends at 6
task # 3 starts at 3 duration 4 ends at 7
殳俊
2023-03-14

免责声明:我的回答基于这样一个想法,即这个问题不经过任何排序就无法解决

老实说,你解决这个问题的办法听起来不错。这个问题描述了结果应该按一定的顺序排列,这意味着不可能找到比O(n log n)更快的解决方案。

这是因为众所周知,不可能存在一种算法或程序能够对复杂度小于O(n logn)的可排序元素列表进行排序。

这意味着,如果您的解决方案在O(n logn)中运行,则您的解决方案是最优的。如果我是你,我会在面试中提到你的解决方案的这个属性,因为它表明你不仅知道你解决了问题,而且知道没有更好的解决方案。

如果你真的要实现这一点,只需练习几次。

 类似资料:
  • 我有这样的桌子 数据如下所示,开始时间和结束时间是连续的时间跨度: 因此,如果用户传递两个参数,则可以在任意时间段内选择* 它应该以如下方式返回表: 你看,棘手的部分是将原始的时间跨度削减到用户定义的时间跨度(@from-@To),我已经为此奋斗了一整天。请指教。 提前非常感谢你!!!

  • 问题内容: 这是我的Django模型: 我需要找到一个在给定日期范围内在办公室花费最多时间的工人。如何从Django查询中的timeIn和timeOut字段计算持续时间? 编辑:我不想使用另一个属性 持续时间, 因为这似乎是多余的。除了使用原始查询或持续时间属性,还有其他方法吗? 问题答案: Django 1.10引入了通过ORM本地执行日期/时间差异的功能。此查询将为您提供最长的转变: 您可以根

  • 问题内容: 我有两个表: 我希望将事件数据添加到视频数据中,以便为每个事件获取视频文件名。记录器字段用于指定在事件发生时可操作的记录器,并协助多个记录器同时记录视频。 如果我不关心没有视频的事件,那很好(我可以获取SQL),但是在我的情况下,我希望显示最接近的视频文件名和秒数差异。 编辑 样本数据 大事记 视频 结果(EventID,VideoID,文件名,IsBetween,secondsDif

  • 一个人打开网站上的页面来执行质量控制任务。在一个页面上,当用户点击开始按钮时,质量控制活动就开始了。在另一个页面上,活动在页面加载时开始。 一旦人员: 完成任务, 另存为不完整,或 只需关闭浏览器窗口 结束时间可以在质量控制任务开始后10秒到30分钟内的任何地方出现。 问题:如果您有一个包含ActivityID、StartTime和EndTime列的表,那么当更新现有记录的操作发生在插入记录的存储

  • 我想从JavaGUI到数据库获取startTime和endTime的值。 电脑座位班 Cobadatabase类 这里的问题是,当单击登录按钮时,开始时间显示在我的数据库中的开始时间和结束时间列上。当单击注销按钮时,将在数据库中创建另一个行,该行在starTime和endTime列上都包含endTime。我想知道为什么会这样...