练习循环和数组

Posted

技术标签:

【中文标题】练习循环和数组【英文标题】:Exercise with loops and arrays 【发布时间】:2021-06-21 16:02:33 【问题描述】:

在针对编码挑战练习编程时,我遇到了这个问题,我被困住了。你有两个数组:

int[] fromArray
int[] toArray

它们保存“节点”的值(来自和到节点)。索引是这样相关的 fromArray[1] -> toArray[1], fromArray[2] -> toArray[2], .... 它有点像链表。因此,例如在索引 0 上的 fromArray 中,您有值 1,然后在 toArray 中的索引 0 上,您有 4。然后,例如,在 fromArray 值 4 中的索引 2 上,以及 toArray 值 9 中的索引 2 上。这意味着值 1 与 4 相连,4 与 9 相连。

我需要找到最后一个节点(没有连接节点的节点)。如果没有,那么它是循环的,我需要在它变成循环之前打印最后一个节点。

这是标准示例,结果应该是 8:

int[] fromArray = new int[] 1, 4, 6, 2;
int[] toArray = new int[] 4, 6, 8, 5;

作为特殊情况,我们有循环列表,例如

int[] fromArray = new int[] 1, 4, 6, 2;
int[] toArray = new int[] 4, 6, 1, 5;

结果应该是 6(即连接 1 到 1 之前的最后一个节点(使这个列表循环)..

这是我最接近的尝试,但我仍然认为我没有解决这个问题的正确途径。我认为我可以通过找出哪个元素在 toArray 中但不在 fromArray 中来解决这个问题,但这不是正确的解决方案:

public static int findLastNode(int[] fromArray, int[] toArray)
    int lastNode = -1;
    boolean found = false;
    int index = -1;
    for (int i = 0; i < fromArray.length; i++)
        for (int j = 0; j < fromArray.length; j++)
            if (toArray[i] == fromArray[j])
                found = true;
            
        
        if (found)
            found = false;
        
        else 
            lastNode = toArray[i];
            return lastNode;
        
       
    
    for (int i = 0; i < toArray.length; i++)
        for (int j = i+1; j < toArray.length; j++)
            if (toArray[i] == toArray[j])
                lastNode = toArray[i];
            
        
    
    return lastNode;

【问题讨论】:

映射模式是否改变?因为有点不清楚模式是什么..在第一种情况下你有1 -&gt; 44 -&gt; 9。似乎用 3 和 5 递增(所以,下一个可以用 7).. 但在另一个例子中,你说,结果应该是 8.. 我迷路了。你确定你有正确的任务表述吗? 你称之为特殊圆形案例的案例实际上包含圆形和非圆形图。 1 -> 4 -> 6 -> 1 是圆形的。 2 -> 5 是非圆形的。那么5是正确的答案吗?当有多个图表时,是否有规则报告哪个图表? @GiorgiTsiklauri 在递增时没有特定的模式 @OleV.V.它必须从数组的第一个元素开始。 如果图是2 -> 3 -> 7 -> 3,应该返回7吗?例如,数组可以是 2, 3, 7 3, 7, 3 。在这种情况下,循环不会回到我们开始的地方。 【参考方案1】:

你想多了。试着一步一步把它们写在一张纸上。

您肯定知道fromArray[0] 已“链接”到toArray[0]。在这种情况下,您可以假设lastNode 将是toArray[0],甚至在您运行算法之前。之后,您需要检查fromArray 中是否有任何“链接值”。如果是,请在该链接的索引处将lastNode 更改为toArray

现在,您需要考虑一下链接是循环的情况。

循环是lastNode 与我们的fromArray[0] 相同,因为它是我们链接的起点。因此,如果lastNode 等于fromArray[0],则您需要在与lastNode 相同的索引处从fromArray 返回值。为避免第二次循环(查找该索引),您可以将其保存到变量lastNodeIndex

最后,我们得到了这个算法:

public static int findLastNode(int[] fromArray, int[] toArray) 
        int lastNode = toArray[0];
        int lastNodeIndex = 0;
        for (int i = 1; i < fromArray.length; i++) 
            if (fromArray[i] == lastNode) 
                lastNode = toArray[i];
                lastNodeIndex = i;
            
        
        return lastNode == fromArray[0] ? fromArray[lastNodeIndex] : lastNode;
    

【讨论】:

您是否假设边缘在数组中按顺序排列?如果数组是 1, 6, 4, 2 4, 8, 6, 5 ,我相信图形是 1 -> 4 -> 6 -> 8,所以答案应该是 8,但您的代码返回 6。 是的,你是对的,我假设边缘是有序的。在这种情况下,我写的算法应该被修改,所以它会检查fromArray,直到没有与toArray的映射。【参考方案2】:

您需要从一个节点到下一个节点遍历图形,直到没有下一个节点或下一个节点是您的起始节点,fromArray[0]。所以编写一个循环来执行这些步骤。您将希望在两个数组中都有一个用于当前索引的变量,即当前边的索引,可以这么说。无论何时toArray[currentIndex] == fromArray[0],您都检测到了一个循环。在这种情况下,返回第一个节点之前的节点,即fromArray[currentIndex]。您可以将return 语句放在循环中的if 语句中。

每次循环都尝试找到下一条边,即索引i,其中fromArray[i] == toArray[currentIndex]。您可以使用内部循环或流管道。如果没有这样的索引,则您已找到最后一个节点。退货吧。

【讨论】:

以上是关于练习循环和数组的主要内容,如果未能解决你的问题,请参考以下文章

javascript循环和数组的基础练习

java _循环练习和数组练习

课堂练习(循环数组的最大子数组和)

EDUCoder编程练习题解(循环二)

EDUCoder编程练习题解(循环二)

for循环和数组练习