задача C#-->Lists-->Array Manipulator (лимит памет)
Здравейте,
Judge ми дава 91 точки на задачата .Проблемът е в използваната памет.
Как с минимални промени в кода мога да достигна 100/100?
Моето решение е: https://pastebin.com/cswgN2Uc.
Условието на задачата:
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.
тази проверка е излишна защото IndexOf(element) ако не намери element, сам си връща -1
опитай да превърнеш командата в масив а не в лист, масива заема малко по-малко памет а в случая ти само четеш от него, така че не ти трябват функционалностите на листа, друго което може да опиташ е да промениш Shift-a малко на нещо такова примерно
int position = int.Parse(commands[1]) % numbers.Count;
List<int> left = numbers.Take(position).ToList();
numbers.RemoveRange(0, position);
numbers.AddRange(left);
няма смисъл от проверката дали ти е по голямо от Count-a, даже и да не е като го разделиш с процента ще си остане същото!
дано да има ефект
EDIT:
А и ако можеш да си направиш метод за всяка една операция и да ползваш тях в Switch-a ще стана по четливо :)
Another EDIT :)
Другата оптимизация която видях сега че и аз съм правил, защото и на мен последния тест ми е гърмял, за numbers си направи new List<int>(), и го напълни с For цикъл, явно нещо LINQ-то бърка работата там, тя тая задача е малко на ръба, нещо такова:
https://pastebin.com/zFHd1jbA
тази проверка не е необходима т.к. ако не го намира връща -1.
промених частта с shift по следния начин:
case "shift":
{
int rotations = int.Parse(command[1]);
while (rotations > 0)
{
int firstElement = numbers[0];
numbers.RemoveAt(0);
numbers.Add(firstElement);
rotations--;
}
, но пак не ми стига памет...