Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият.
Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание.
Използваме бисквитки и за измерване на маркетинговите ни усилия.
Спомагателният списък не става ли излишен така? Можеш да принтираш всяко число, което отговаряна критерия, докато въртиш отзад напред.
Това се иска в задачата. За тая задача има безброй много решения сигурно. Аз също не бих ползвал два списъка, можем да избегнем всички негативни още при четенето Where(n=> n>0). След това Reverse и проверката дали е празен списъка и принтираме.
В решението на задача от материала за листове още един лист никога не е излишен. Все пак задачите от този материал са именно за да се упражняват списъците
и аз съм съгласен относно спомагателния списък - няма смисъл от него. като цяло моето решение е почти същото като поправеното на icowwww. един фор цикъл за проверка, като ако се махне числото, цикъла се връща с едно назад. после ривърсвам списъка с LINQ и правя проверка дали има числа в него. simple.
https://pastebin.com/SnXzc4tj
Аз по-скоро го споменавам от оптимизационна гледна точка.
Ако .Where()-неш и после .Reverse()-неш, ще минеш през всички елементи на списъка два пъти. Ако добавяш в нов списък и после го string.Join()-неш, отново ще минеш през всички елементи два пъти (един път за да ги филтрираш и един път за да ги изпечаташ).
Идеята ми е да се минава през всеки от зад на пред и да се изпечата в момента, в който отговори на условието. Така през един елемент от списъка ще минеш точно веднъж преди да го отпечаташ.
P.S.: Като цяло е хубаво в процеса на учене да се мине през всички варианти (супер е, че всеки е споменал различен вариант), първо за да се научат съответните методи и логически операции, а също така и като оттрениране на оптимизацията.
Да, но как ще направиш проверката дали списъка е празен ако не пазиш никъде тази информация. С един брояч може да стане не знам как е от оптимизационна гледна точка
var list = Console.ReadLine().Split(' ').Select(int.Parse).ToList();
var counter = 0;
for (int i = list.Count - 1; i >= 0; i--)
{
if (list[i] >= 0)
{
Console.WriteLine(list[i] +" ");
counter++;
}
if (i==0 && counter == 0)
{
Console.Write("empty");
}
}
Console.WriteLine();
От оптимизационна гледна точка, това вече е микрооптимизация, която почти никога няма значение :) Горният код е ОК.
Ако все пак искаме да го оптимизираме, трябва да намалим броя операции. В случая увеличаването на брояч са две операции: прочитане на старата стойност и слагане на нова стойност в паметта (read + write). Можем да го сведен само до една операция - слагане на стойност в паметта (write), без значение старата. Например "дали сме намерили нещо" т.е. булева стойност.
Постоянното печатане може също да се окаже бавно заради буфера на конзолата. Трябва да се замери дали не е по-бързо да се съхраняват стойностте първо в StringBuilder и да се принтират накрая. Не мога да гарантирам без да се тества. Но по-скоро няма да е, ще е нещо като спомагателния списък.