Код внутри для l oop не работает. Индекс находился вне границ массива - PullRequest
0 голосов
/ 20 апреля 2020

Когда внутри для l oop, код не работает. Ошибка: индекс находился за пределами массива. Когда я помещаю код в метод main и пытаюсь вручную, все работает. Можете ли вы сказать мне, что не так?

namespace HackerRankProblems
{
    class Program
    {

        static int[] serviceLane(int n, int[] width, int[,] cases)
        {
            List<int> list = width.OfType<int>().ToList();
            List<int> returnList = new List<int>();
            List<int> tempList;
            for (int i = 0; i < n; i++)
            {
                tempList = list.GetRange(cases[i, 0], cases[i, 1]);
                returnList.Add(tempList.Min());



            }
            int[] returnArray = returnList.ToArray();
            return returnArray;

        }


        static void Main(string[] args)
        {

            int[,] cases = new int[,]
            {
                {1,2},
                {3,4},
                {5,7}
            };

            int[] width = new int[] { 2, 3, 1, 2, 3, 2, 3, 3 };

            List<int> lista = width.OfType<int>().ToList();
            List<int> returnLista = new List<int>();

            List<int> tempList = lista.GetRange(cases[3, 0], cases[1, 1]);
            returnLista.Add(tempList.Min());
            int[] returnArray = returnLista.ToArray();
            string.Join(",", serviceLane(3, width, cases));// Error


        }
    }
}

Ответы [ 3 ]

0 голосов
/ 20 апреля 2020

Ваша проблема возникает, когда n = 2, и это происходит потому, что случаи [i, 0], которые равны 5, и случаи [i, 1], которые составляют от 7 до 12, когда длина списка равна 8, я думаю, что вы пытаетесь сделать это

static int[] serviceLane(int n, int[] width, int[,] cases)
{
    List<int> list = width.OfType<int>().ToList();
    List<int> returnList = new List<int>();
    List<int> tempList;
    for (int i = 0; i < n; i++)
    {
        tempList = list.GetRange(cases[i, 0], cases[i, 1] - cases[i, 0]);
        returnList.Add(tempList.Min());
    }
    int[] returnArray = returnList.ToArray();
    return returnArray;

}
0 голосов
/ 21 апреля 2020

Слишком много массивов и списков. Все эти преобразования назад и вперед эффективно делают полные копии данных. Вы можете сэкономить много работы, придерживаясь IEnumerable.

class Program
{

    static IEnumerable<int> serviceLane(int[] width, int[,] cases)
    {
        return Enumerable.Range(0, cases.GetUpperBound(0)).
               Select(i => width.Skip(cases[i,0]).Take(cases[i,1]).Min());
    }

    static void Main(string[] args)
    {
        int[,] cases = new int[,]
        {
            {1,2},
            {3,4},
            {5,7}
        };

        int[] width = new int[] { 2, 3, 1, 2, 3, 2, 3, 3 };

        //changed to [1,0] to say within the bounds of the array
        var temp = width.Skip(cases[1,0]).Take(cases[1,1]);
        var resultArray = new int[] {temp.Min()};
        var resultString = string.Join(",", serviceLane(width, cases));
    }
}

Однако эта программа будет иметь ту же проблему, что и оригинал: неверные данные . Массив width невелик для всех возможных примеров. Мы можем настроить метод, чтобы учесть это:

static IEnumerable<int> serviceLane(int[] width, int[,] cases)
{
    return Enumerable.Range(0, cases.GetUpperBound(0)).
         Select(i => 
         {
             if (cases[i,0] + cases[i,1]) >= width.Length)
             {
                 //do something here. Width is not long enough.
             }
             else 
                 return width.Skip(cases[i,0]).Take(cases[i,1]).Min();
         });
}

Но, вероятно, мы неправильно видим данные выборки ширины.

0 голосов
/ 20 апреля 2020

Проблема list.GetRange(cases[i, 0], cases[i, 1]). Когда n равен 2, то вызов list.GetRange(cases[i, 0], cases[i, 1]) такой же, как list.GetRange(5, 7), но width / list имеет только 8 элементов, а не 12!

Не зная точно, что вы хотите достичь / какой должен быть ожидаемый результат, трудно понять, каким он должен быть!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...