C# LeetCode:N天后的监狱牢房

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,

斯塔克,我不能完全相信这个奇怪的东西。我每次都在评估阵列中的位置。为什么每次我收到不同的结果时都会初始化数组。。。如果有人能解释一下,我将不胜感激

在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,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:)至于为什么会出现在标题中。。。不知道,是的,就是这样。通过在内部循环中重新创建,内存位置就不同了。这意味着,当我对所讨论的变量进行更改时,“上一次”迭代的组成没有改变。谢谢是的,就是这样。通过在内部循环中重新创建,内存位置就不同了。这意味着,当我对所讨论的变量进行更改时,“上一次”迭代的组成没有改变。非常感谢。