Loading...
ivandm5 avatar ivandm5 17 Точки

[Programming Fundamentals] 01.Remove Negatives and Reverse

Здравейте, започнах да решавам задачи с листове, но не схващам как трябва да стане. Някой ще ми обясни ли.
Ето кода ми

Също така не схващам защо трябва да го направя с обратен цикъл. Видях го от хинта. Сега как да му направя Reverse. Пробвах с list.reverse(); Но не стана. 

Тагове:
0
Programming Fundamentals 16/06/2017 14:50:28
icowwww avatar icowwww 2791 Точки

Създай два листа единия за числата от конзолата, а другия празен.

Пусни един цикъл отзда напред, който проверява всяко число дали е по-голямо или по-малко от нула. Ако е по голямо от нула го добави във новия лист. След цикъла направи проверка дали дължината на новия лист е 0. Ако е 0 изкарай empty, ако не е изкара всички числа от листа със string.Join.

С обратния цикъл правиш 2в1, хем проверяваш всеки елемент, хем като е наобратно значи няма нужда да обръщаш после листа

https://pastebin.com/hfXxA09i

0
16/06/2017 11:58:43
RoYaL avatar RoYaL Trainer 6849 Точки

Спомагателният списък не става ли излишен така? Можеш да принтираш всяко число, което отговаряна критерия, докато въртиш отзад напред.

0
16/06/2017 14:09:03
icowwww avatar icowwww 2791 Точки

Това се иска в задачата. За тая задача има безброй много решения сигурно. Аз също не бих ползвал два списъка, можем да избегнем всички негативни още при четенето Where(n=> n>0). След това Reverse и проверката дали е празен списъка и принтираме.

В решението на задача от материала за листове още един лист никога не е излишен. Все пак задачите от този материал са именно за да се упражняват списъците

0
16/06/2017 14:24:53
Bullsized avatar Bullsized 153 Точки

и аз съм съгласен относно спомагателния списък - няма смисъл от него. като цяло моето решение е почти същото като поправеното на icowwww. един фор цикъл за проверка, като ако се махне числото, цикъла се връща с едно назад. после ривърсвам списъка с LINQ и правя проверка дали има числа в него. simple.

0
RoYaL avatar RoYaL Trainer 6849 Точки

Аз по-скоро го споменавам от оптимизационна гледна точка.

Ако .Where()-неш и после .Reverse()-неш, ще минеш през всички елементи на списъка два пъти. Ако добавяш в нов списък и после го string.Join()-неш, отново ще минеш през всички елементи два пъти (един път за да ги филтрираш и един път за да ги изпечаташ).

Идеята ми е да се минава през всеки от зад на пред и да се изпечата в момента, в който отговори на условието. Така през един елемент от списъка ще минеш точно веднъж преди да го отпечаташ.

P.S.: Като цяло е хубаво в процеса на учене да се мине през всички варианти (супер е, че всеки е споменал различен вариант), първо за да се научат съответните методи и логически операции, а също така и като оттрениране на оптимизацията.

0
icowwww avatar icowwww 2791 Точки

Да, но как ще направиш проверката дали списъка е празен ако не пазиш никъде тази информация. С един брояч може да стане не знам как е от оптимизационна гледна точка

           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();

0
16/06/2017 18:03:21
RoYaL avatar RoYaL Trainer 6849 Точки

От оптимизационна гледна точка, това вече е микрооптимизация, която почти никога няма значение :) Горният код е ОК.

Ако все пак искаме да го оптимизираме, трябва да намалим броя операции. В случая увеличаването на брояч са две операции: прочитане на старата стойност и слагане на нова стойност в паметта (read + write). Можем да го сведен само до една операция - слагане на стойност в паметта (write), без значение старата. Например "дали сме намерили нещо" т.е. булева стойност.

            bool found = false;
            for (int i = list.Count - 1; i >= 0; i--)
            {
                if (list[i] >= 0)
                {
                    Console.Write(list[i] + " ");
                    found = true;
                }              
            }
            if (!found) Console.WriteLine("empty");
            

Постоянното печатане може също да се окаже бавно заради буфера на конзолата. Трябва да се замери дали не е по-бързо да се съхраняват стойностте първо в StringBuilder и да се принтират накрая. Не мога да гарантирам без да се тества. Но по-скоро няма да е, ще е нещо като спомагателния списък.

0
16/06/2017 18:20:57
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.