【问题标题】:Difference between one pass (scan) and two pass(scan)一次通过(扫描)和两次通过(扫描)之间的区别
【发布时间】:2016-06-29 13:04:29
【问题描述】:

我在前一天接受了采访。 面试官告诉我,“写一个程序在链表的末尾添加一个节点”。 我给了他一个解决方案。但他告诉我一次性实现(一次扫描)。 谁能解释一下,一关是什么意思,如何找到写的程序是一关还是二关?

    这是我的代码
public void atLast(int new_data)                             
{
    Node new_node=new Node(new_data);               
    if(head==null)                                  
    {
        head=new Node(new_data);
        return;
    }
    new_node.next=null;                              
    Node last=head;                                 
    while(last.next!=null)
    {
        last=last.next;
    }
    last.next=new_node;                             
    return;
}

【问题讨论】:

  • 您的解决方案是什么? “通过”是指通过集合的单次迭代。所以“一次通过”意味着只遍历节点一次;两次通过是两次,等等。
  • 也许可以告诉我们您的解决方案,看看它是否真的不是一次性完成
  • 这对我来说似乎是一次通行证。
  • 我想知道面试官可能想混淆我。谢谢大家。

标签: data-structures computer-science


【解决方案1】:

如果那是你给面试官的代码,那肯定是看错了,因为它是一次通过。

在您的情况下,“通过”将是您的 while 循环。它也可以通过递归、for 或任何其他类型的遍历数组(或其他形式的项目列表)中的元素的循环来完成。

在您的代码中,您遍历Node 列表并在末尾插入元素。这是在一个循环中完成的,使其一次通过。

现在来看一个有两次通过的案例。举例来说,你被要求删除具有最大值的元素并写了类似这样的内容:

int index = 0;
int count = 0;
int max = 0;
while(temp_node != null)
{
    if(temp_node.data > max)
    {
        index = count;
        max = temp_node.data;
    }
    count++;
    temp_node = temp_node.next;
}

for(int i = 0; i < count; i++)
{
    if(i == index)
    {
        //Functionality to remove node.
    }
}

第一遍 (while) 检测到具有最大值的Node。第二遍 (for) 通过再次遍历所有元素直到找到正确的元素,删除了这个 Node

【讨论】:

  • 这是一个简单的解释,谢谢,现在我清楚了。 :)
【解决方案2】:

我想这里的“两次通过”意味着您在代码中对整个列表进行了两次迭代。您不需要这样做来添加新节点。

【讨论】:

    猜你喜欢
    • 2010-11-14
    • 1970-01-01
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    相关资源
    最近更新 更多