将Int []数组添加到List <int []> </int []>中

时间:2014-05-18 05:03:49

标签: c# arrays algorithm

我在使用int []数组时遇到问题,并将它们添加到List&lt;&gt;中。我想将int []数组的值添加到每个循环的内容中,但每次执行此操作时,我的“something”会为我添加的每个元素获取相同的值。很烦人。我理解数组总是引用变量。然而,即使是“新”关键词似乎也没有帮助。需要做的是将结果添加到某个枚举对象,如List或Array或ArrayList。

这是codility问题:

您将获得N个计数器,最初设置为0,您可以对它们进行两种操作:

  • 增加(X) - 计数器X增加1,
  • max_counter - 所有计数器都设置为任何计数器的最大值。

给出了M个整数的非空零索引数组A.此数组表示连续操作:

  • 如果A [K] = X,使得1≤X≤N,则操作K增加(X),
  • 如果A [K] = N + 1,则操作K为max_counter。

例如,给定整数N = 5且数组A使得:

A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 6
A[4] = 1
A[5] = 4
A[6] = 4

每次连续操作后计数器的值为:

(0, 0, 1, 0, 0)
(0, 0, 1, 1, 0)
(0, 0, 1, 2, 0)
(2, 2, 2, 2, 2)
(3, 2, 2, 2, 2)
(3, 2, 2, 3, 2)
(3, 2, 2, 4, 2)

目标是在所有操作之后计算每个计数器的值。

我从其他人复制了一些代码,变量“result”确实正确地加载了数据。我只是想把它复制回主程序,所以我可以看到它。唯一有效的方法是+ =将其添加到字符串中。因此失去了我可能获得的任何效率。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace testarray
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] A = new int[7];
            A[0] = 3;
            A[1] = 4;
            A[2] = 4;
            A[3] = 6;
            A[4] = 1;
            A[5] = 4;
            A[6] = 4;
            List<int[]> finish = solution(5, A);

        }
        public static List<int[]> solution(int N, int[] A)
        {
            int[] result = new int[N];
            int maximum = 0;
            int resetlimit = 0;
            int iter = 0;
            List<int[]> collected_result = new List<int[]>;

            for (int K = 0; K < A.Length; K++)
            {
                if (A[K] < 1 || A[K] > N + 1)
                {
                    throw new InvalidOperationException();
                }

                if (A[K] >= 1 && A[K] <= N)
                {
                    if (result[A[K] - 1] < resetlimit)
                    {
                        result[A[K] - 1] = resetlimit + 1;
                    }
                    else
                    {
                        result[A[K] - 1]++;
                    }

                    if (result[A[K] - 1] > maximum)
                    {
                        maximum = result[A[K] - 1];
                    }
                }
                else
                {
                    resetlimit = maximum;
                    result = Enumerable.Repeat(maximum, result.Length).ToArray<int>();

                }

                collected_result.Add(result);

            }
                  //    for (int i = 0; i < result.Length; i++)
                  //result[i] = Math.max(resetLimit, result[i]);

            return collected_result;
        }

    }
}

这不起作用,gather_result最终结果如下:

(0,0,1,2,0)
(0,0,1,2,0)
(0,0,1,2,0)
(3,2,2,4,2)
(3,2,2,4,2)
(3,2,2,4,2)
(3,2,2,4,2)

我知道这行是gather_result.Add(结果);每次将引用添加到List&lt;&gt;中的每个结果实例。烦。我试过添加“new”这是一个编译器错误。最后在绝望中我只是将所有内容添加到一个很长的字符串中。有人可以帮我弄清楚如何正确加载一个对象传回主要?

2 个答案:

答案 0 :(得分:2)

最简单的方法:

在将数组添加到列表之前获取数组的副本:

collected_result.Add(result.ToArray());

答案 1 :(得分:0)

这是一个Python解决方案: def解决方案(A,N):     lenA = len(A)     k = 0     max_counter_value = 0     counter = [0表示范围内的x(0,N)]

for k in range(0, lenA):
    if A[k] >= 1 and A[k] <= N:
        counters[A[k] - 1] += 1
        max_counter_value = max(counters)
    if A[k] == N + 1:
        counters = [max_counter_value for x in range(0, N)]
    print counters

A = [3,4,4,6,1,4,4] N = 5

溶液(A,N)