Професионална програма
Loading...
SvilenPavlov avatar SvilenPavlov 11 Точки

Programming Fundamentals - Lists Exercises 05.Array Manipulator

Здравейте!

Получавам 66/100 с кода по-долу. 
Имам 3 грешни отговора и 1 път лимит памет.
Бихте ли ми помогнали?
Благодаря, предварително!

 

Кода - https://pastebin.com/ViVjr88g
Условието:

5.   * Array Manipulator

Write a program that reads an array of integers from the console and set of commands and executes them over the array. The commands are as follows:

  • add <index> <element> – adds element at the specified index (elements right from this position inclusively are shifted to the right).
  • <index> <element 1> <element 2> … <element n> – adds a set of elements at the specified index.
  • contains <element> – prints the index of the first occurrence of the specified element (if exists) in the array or -1 if the element is not found.
  • remove <index> – removes the element at the specified index.
  • shift <positions> – shifts every element of the array the number of positions to the left (with rotation).
    • For example, [1, 2, 3, 4, 5] -> shift 2 -> [3, 4, 5, 1, 2]
  • – sums the elements in the array by pairs (first + second, third + fourth, …).
    • For example, [1, 2, 4, 5, 6, 7, 8] -> [3, 9, 13, 8].
  • print – stop receiving more commands and print the last state of the array.
Тагове:
0
Programming Fundamentals
EricDraven avatar EricDraven 275 Точки

Аdd-а ти е ОК

AddMany може да го съкратиш малко като използваш LINQ

int index = int.Parse(command[1]);
list.InsertRange(index, command.Skip(2).Select(int.Parse));

Contains също може да го съкратиш защото IndexOf ако не намери елемента си връща -1 и няма нужда от цикъл и условия:

int magic = int.Parse(command[1]);
Console.WriteLine(list.IndexOf(magic));

Remove ти е ОК

за Shift бих ти предложил следния вариант:

int position = int.Parse(command[1]) % list.Count;
List<int> left = list.Take(position).ToList();

list.RemoveRange(0, position);
list.AddRange(left);

и за SumPairs ти трябва проверката, за която е споменал колегата:

List<int> result = new List<int>();

for (int index = 0; index < list.Count; index += 2)
{
    if (index < list.Count - 1)
    {
        result.Add(list[index] + list[index + 1]);
     }
     else
     {
        result.Add(list[index]);
     }
}

list = result;

Другото което бих те посъветвал е да си направиш отделен метод за всяка една операция и в switch-а само да ги извикваш

 

0
21/08/2018 21:41:14
SvilenPavlov avatar SvilenPavlov 11 Точки

Първо, благодаря за помощта! :)
Второ - пробвах LINQ магията в аддМени, Контейнс и Шифт и пак дедовия. На шифт най-мн се надявах, излгеждаше, че ще съкрати най-много операции.
Бал съм го.

0
EricDraven avatar EricDraven 275 Точки

Сега гледам че и на мен ми е гърмял последния тест за памет на времето, оправил съм го като съм си прочел входа в масив не в лист и без Select в четенето, след това съм пълнил листа със цикъл, ако искаш пробвай да го промениш, направи го така:

string[] input = Console.ReadLine()
    .Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)
    .ToArray();

List<int> list = new List<int>();

foreach (string item in input)
{
    list.Add(int.Parse(item));
}

Явно просто не са си преценили разрешената памет за задачата

0
23/08/2018 16:53:13