[C#] Домашно Strings and Text Processing - 21 задача


8

Условие: Write a program that reads a string from the console and prints all different letters in the string along with information how many times each letter is found. 

Решениеsource.

Обяснение: Правим масив с максималния брой букви. След това четем стринга символ по символ. Ако текущият символ е буква, увеличаваме елемента с индекс номера на буквата с единица. Накрая принтираме само буквите, които са се срещали.




Отговори



3

Решение:

http://pastebin.com/2XbdSb7e

Обяснение:

1. Приемам входа и премахвам от негово всички ненужни знанци ( като цяло сега като се замисля е хубаво да се махнат и цифрите, но това може да стане чрез добавянето им в масива от специални знаци)

2. След като обработя стринга си го обхождам и при всяко срещане на нова буква я добавям в масива, а ако вече я има увеличавам нейния value.

3. Сортирам речника с лабда израз и го принтирам.

Не е най-оптималното решение, но като цяло ми бе доста интересно да реша задачата така :)


от Teodor92 (13062 точки)


7

И тази задача може да се сведе до 1-2 реда (2, в случай, че искаме да махнем не-буквите) благодарение на GroupBy:

var chars = _str.ToLower().ToCharArray().GroupBy(c => c);
foreach(var ch in chars) Console.WriteLine("{0}: {1}", ch.Key, ch.Count());
 
Като тук приемам, че _str е обработен да има само букви (нещо, което не представлява особен интерес).
 

от gugulete (110 точки)


0
Аз го правя така но идеята е същтата: str.Replace(" ", "").ToCharArray().GroupBy(i => i).Select(i => new { Letter = i.Key, Count = i.Count() }).ToList().ForEach(g => { Console.WriteLine(g.Letter + " : " + g.Count); });

от saykor (8845 точки)


0

 

Обхождам стринга символ по символ и ако символът го няма го добавям в речник (Dictionary) <string;int>, а ако е добавен му повишавам стойността +1.
 



1

Ето и моето решение с Dictionary, като дирекно обхождам низа с foreach и ако символа отговаря на определените условия го вписвам като нов ред в речника или го добавям към реда на речника. Получи се доста кратко и ясно решение.


от AsenVal (3487 точки)


3

Моето решение е изцяло по препоръката от книгата на Наков. И все пак съм готов да понеса всякакви критики, защото така се учи много, и ще съм ви много благодарен!

http://pastebin.com/UmYsKWuH


от Svetli (280 точки)


0
Ето решение с 2 list-a всеки път като срещна буква, която не я е имало досега я добавям във списъка.
http://pastebin.com/KhtTS2TM

от makmidov (598 точки)


0
using System; using System.Linq;
class Program { static void Main() { string text = "strrrrriiing"; foreach (var item in text.GroupBy(c => c)) { Console.WriteLine("{0} = {1}", item.Key, item.Count()); } } }



0

работя с 2 списъка, един за буквите с един за срещанията

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

решение http://pastebin.com/y00nGGHv




0

Направих едно много готино решение, или поне на мен така ми се струва:

http://pastebin.com/YtW5cXrn

Работя с един булев масив, в който отбелязвам вече посетените букви.

Обхождам целия текст, при срещане на буква, която в булевия масив има стойност false, с IndexOf минавам през всички срещания на дадената буква и в един брояч броя колко пъти съм я срещнал.

Направо ги печатам на конзолата, иначе за лека оптимизация може да се добавят в един Dictionary.


от Yordan.Bonev (780 точки)


1

Решение: source

Правя масив от всички символи обхождам текста и увеличавам с единица този елемент от масива, който е номера на символа. След това обхождам масива и проверявам ако не е 0 и е буква печатам на екрана.


от stanchev (197 точки)


0
Много хитро си решил задачата с масиви като избягваш вложените цикли. Само това 65536 е малко стряскащо. Мисля че с 128 пак ще работи добре с латински букви.

от stanev.plamen (1143 точки)

0
Ами символите в .net са 16 битови, и затова съм сложил 65536 - всички възможни символи да хваща. Но по принцип да, може да се направи само за латински до толкова.

от stanchev (197 точки)