Професионална програма
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
willystyle avatar willystyle 2418 Точки

Да, грешката е в sumPairs. Сумираш по двойки, но може листа да е с нечетен брой елементи, тогава последния не се сумира с нищо. В твоето решение най-леко ще минеш ако добавиш проверка за четност на ред 72:

 for (int i = (list.Count % 2 == 0) ? (list.Count - 1) : (list.Count - 2); i >0; i-=2)

ако не си наясно с тернарния оператор, той избира от къде да почнат операцийте: ако листа е с нечетна дължина почва операцията от предпоследния елемент.

0
SvilenPavlov avatar SvilenPavlov 11 Точки

Прав си! Докато четях условието, си казах, че тука ще ни бомбят с нечетни и после съвсем забравих мерси!

0
EricDraven avatar EricDraven 275 Точки

това за паметта най вероятно ти идва от Shift метода, там това

int positions = int.Parse(command[1]);

можеш да го разделиш на count-a на листа, за да не правиш излишни завъртания

EDITED:

нещо такова int positions = int.Parse(command[1]) % list.Count; 

защото например при лист с 5 елемента, дали ще го завъртиш 2, 7, 22, или 5002 пъти резултата ще е един и същ, но последното отнема повече време

0
21/08/2018 15:44:22
SvilenPavlov avatar SvilenPavlov 11 Точки

Май имаш предвид %list.Count? Никога нямаше да се сетя!

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

int positions = int.Parse(command[1])%5;
Console.WriteLine(positions);

и взе, че ми излезе последния тест 😂 
Тъжното, че като го поправих на:
int positions = int.Parse(command[1])%list.Count;
пак ми дава грешка в паметта на последния тест :(

Май е от другаде.
 

0
21/08/2018 11:44:05
EricDraven avatar EricDraven 275 Точки

Да % Count, объркал съм го горе, би трябвало да стане, нещо ми се е бъгнало Visual Studio-то, като се прибера от работа, ако все още не си го оправил ще погледна пак, другите грешки оправиха ли се? Дай редактиран код, ако имаш напредък да гледаме по него

0
21/08/2018 15:45:33
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