练习循环和数组
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 -> 4
和4 -> 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]
。您可以使用内部循环或流管道。如果没有这样的索引,则您已找到最后一个节点。退货吧。
【讨论】:
以上是关于练习循环和数组的主要内容,如果未能解决你的问题,请参考以下文章