C# LeetCode:N天后的监狱牢房
斯塔克,我不能完全相信这个奇怪的东西。我每次都在评估阵列中的位置。为什么每次我收到不同的结果时都会初始化数组。。。如果有人能解释一下,我将不胜感激 在While循环中:正确C# LeetCode:N天后的监狱牢房,c#,algorithm,C#,Algorithm,斯塔克,我不能完全相信这个奇怪的东西。我每次都在评估阵列中的位置。为什么每次我收到不同的结果时都会初始化数组。。。如果有人能解释一下,我将不胜感激 在While循环中:正确 0,1,0,1,1,0,0,1 0,1,1,0,0,0,0,0,0 0,0,0,0,1,1,0 0,1,1,0,0,1,0,0 0,0,0,0,0,1,0,0 0,1,1,1,0,1,0,0,0 0,0,1,0,1,1,0,0 0,0,1,1,0,0,0,0 外部While循环(初始化一次):不正确 0,1,0,1,1,0,
0,1,0,1,1,0,0,1
0,1,1,0,0,0,0,0,0
0,0,0,0,1,1,0
0,1,1,0,0,1,0,0
0,0,0,0,0,1,0,0
0,1,1,1,0,1,0,0,0
0,0,1,0,1,1,0,0
0,0,1,1,0,0,0,0 外部While循环(初始化一次):不正确
0,1,0,1,1,0,0,1
0,1,1,0,0,0,0,0,0
0,0,1,0,1,0,1,0,1,0
0,0,1,1,0,0,1,0
0,0,0,1,0,0,1,0
0,1,1,0,1,1,0,0
0,0,1,1,1,0,1,0
0,0,0,0,1,1,0,0 问题详细信息 一排有8个牢房,每个牢房要么被占用,要么空置 每天,单元格是否被占用或空闲都会根据以下规则进行更改: 如果一个单元有两个相邻的邻居,两个邻居都被占用或都空闲,则该单元变为被占用。 否则,它就会空置。 (请注意,因为监狱是一排,所以该行的第一个和最后一个单元格不能有两个相邻的相邻单元格。) 我们用以下方式描述监狱的当前状态:如果第i个单元被占用,则单元[i]==1,否则单元[i]==0 给定监狱的初始状态,在N天后返回监狱状态(以及上述N种更改) 示例1:预期输出 输入:单元格=[0,1,0,1,1,0,0,1],N=7
输出:[0,0,1,1,0,0,0,0]
说明:
下表总结了监狱每天的状况:
第0天:[0,1,0,1,1,0,0,1]
第1天:[0,1,1,0,0,0,0,0]
第二天:[0,0,0,0,1,1,1,0]
第3天:[0,1,1,0,0,1,0,0]
第4天:[0,0,0,0,0,1,0,0]
第5天:[0,1,1,1,0,1,0,0]
第6天:[0,0,1,0,1,1,0,0]
第7天:[0,0,1,1,0,0,0,0] 方法
static public int[] PrisonAfterNDays(int[] cells, int N)
{
int counter = 0;
//Doesn't work if it's here
//int[] temp = new int[8];
while(counter < N)
{
Console.WriteLine(String.Join(",",cells));
//Works if it's here ?!?!?!
int[] temp = new int[8];
for(int j = 1; j < 8-1; j++)
{
if(cells[j-1] == cells[j+1])
{
temp[j] = 1;
}
else
{
temp[j] = 0;
}
}
cells = temp;
counter++;
}
return cells;
}
静态公共int[]PrisonAfterNDays(int[]单元格,int N)
{
int计数器=0;
//如果它在这里就不起作用了
//int[]temp=新int[8];
while(计数器
请记住,尽管int
是一种值类型,但数组是引用类型,因此int[]
是一种引用类型。(见附件)
当您执行cells=temp
,您将单元格
和临时
指向完全相同的数组!您可以使用以下代码对此进行测试:
int[] a = new int[2];
int[] b = a;
b[0] = 85;
b[1] = 3;
Console.WriteLine(a[0]); // prints 85
Console.WriteLine(a[1]); // prints 3
这意味着在外循环的第二次迭代中,以下代码同时改变了单元格[j]
和temp[j]
:
temp[j] = 1;
这显然意味着你会得到奇怪的结果
因此,我认为应该在循环中定义
temp
。请记住,即使int
是值类型,数组也是引用类型,因此int[]
是引用类型。(见附件)
当您执行cells=temp
,您将单元格
和临时
指向完全相同的数组!您可以使用以下代码对此进行测试:
int[] a = new int[2];
int[] b = a;
b[0] = 85;
b[1] = 3;
Console.WriteLine(a[0]); // prints 85
Console.WriteLine(a[1]); // prints 3
这意味着在外循环的第二次迭代中,以下代码同时改变了单元格[j]
和temp[j]
:
temp[j] = 1;
这显然意味着你会得到奇怪的结果
出于这个原因,我认为您应该在循环中定义
temp
。您是否尝试过调试您的代码?leetcode是什么?为什么它在循环中title@Michael它似乎是某种学习平台。谢天谢地,这不是brainf的变体!@或者lolcode:)至于为什么会出现在标题中。。。不知道。你试过调试你的代码吗?leetcode是什么?为什么它在title@Michael它似乎是某种学习平台。谢天谢地,这不是brainf的变体!@或者lolcode:)至于为什么会出现在标题中。。。不知道,是的,就是这样。通过在内部循环中重新创建,内存位置就不同了。这意味着,当我对所讨论的变量进行更改时,“上一次”迭代的组成没有改变。谢谢是的,就是这样。通过在内部循环中重新创建,内存位置就不同了。这意味着,当我对所讨论的变量进行更改时,“上一次”迭代的组成没有改变。非常感谢。