【问题标题】:Do these stacks need to be merged?这些堆栈需要合并吗?
【发布时间】:2012-02-13 10:59:20
【问题描述】:

在作为考试 98-361,软件开发基础知识一部分的能力评估中,会弹出以下问题:

场景 3-3:使用堆栈

您正在编写一个使用两个堆栈的程序。每个堆栈中的数据已经按降序排列。您需要处理两个堆栈的内容,以使输出按屏幕升序打印。你会怎么写这样的程序?

现在,我已经对这个场景进行了编码。我的解决方案是遍历两个单独的堆栈,通过弹出它们的项目直到堆栈为空,将它们合并到一个列表中,然后将列表排序为正确的顺序。

但是,让我感到震惊的是,关于我是否应该合并堆栈的问题有点模糊。它是隐含的种类,但它种类不是。

如果你正在阅读这个问题,你会如何解释它?

请注意,我实际上并没有参加这个考试,只是在为它做准备。在我看来,这更像是一个需求解释问题。

【问题讨论】:

  • 我认为你是对的。在我看来,除非它们应该被合并,否则没有必要指定 两个 堆栈。
  • @Blorgbeard:我就是这么想的。 “两堆”的特殊性似乎暗示着他们希望它们合并。您是否有机会将其放入答案中,从而获得荣誉?

标签: c# requirements


【解决方案1】:

我的观点:

DECLARE NEW_LIST;
INT COUNT = STACK_A.COUNT() + STACK_B.COUNT()

FOR I=0 TO COUNT-1
    IF STACK_A.PEEK() > STACK_B.PEEK()
       NEW_LIST.ADD(STACK_A.POP())
    ELSE
       NEW_LIST.ADD(STACK_B.POP());

现在您有已排序的NEW_LIST - 您只需要决定打印顺序 (逆序为升序)

假设m, n是两个栈的初始大小,

合并两个堆栈然后对列表进行排序会花费更多 -

O((n+m)log(n+m)) 用于快速排序,这显然比

O(m+n) - 上面的解决方案

【讨论】:

  • 为什么不直接使用托管堆栈呢?我认为这更多是他们所追求的。但是上面的解决方案应该没问题。
  • 这是我解释问题的方式,-1 是什么意思?这就是 I 对这个问题的回答,OP 肯定会发现这篇文章很有用。 OP提到他通过合并和排序得到了这个;确实,知道如何实际编写代码在求职面试中很重要,但一些雇主确实寻求优化的解决方案,而不是简单、缓慢的解决方案。软件工程师肯定需要牢记这一点!
  • 我确实觉得这个答案很有用,因为它让我想到了性能。但是,这个特殊问题与性能无关。它专门用于测试我使用堆栈的知识。我不会通过钻研其他任何事情来使它复杂化。 :)
  • @Shai 很公平,如果你编辑你的答案,我可以删除我的反对票(任何微不足道的编辑都应该这样做)
  • @MikeHofer 至少你得到了另一个的问题,这将帮助你在未来处理更复杂的任务
【解决方案2】:

我认为你是对的。这是我最初的解释(尽管我同意这似乎有点模糊)。进一步思考,在我看来没有必要指定两个堆栈,除非它们应该被合并。

【讨论】:

    【解决方案3】:

    这个问题听起来像是一个合并排序的设置;要以组合、排序(但相反)的顺序获取两者的内容,您反复查看每个堆栈的顶部以查看哪个值较低(id est,以降序排序的较早),将值从该堆栈中弹出并将其推入第三个堆栈。重复直到两个源堆栈都为空,并且因为您的第三个堆栈是 FILO,所以您按降序添加的项目将按升序弹出。

    【讨论】:

      猜你喜欢
      • 2012-12-02
      • 1970-01-01
      • 2017-07-26
      • 2020-10-13
      • 1970-01-01
      • 1970-01-01
      • 2021-07-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多