Обяснение на задачите/упражненията от домашното към лекцията Масиви от курса JavaScript Part 1 в Академията. Условията на задачите и съответно обясненията на самите алгоритми за решаване са подобни на тези от от лекцията Масиви от C# курса, затова няма да се спирам да ги обяснявам в подробности наново. По-скоро ще се концентрираме върху това как да се донагодят решенията до синтаксиса и особеностите на самия JavaScript. Файловете с решения съдържат само JavaScript код, без никакви допълнителни стилизирания, потребителски менюта в браузъра и се извеждат като резултат директно на JS конзолата (console.log)… Т.е. решенията няма да приемат входа на стойностите от потребителя, а ще е зададен като променливи в самия код.
{ Кодът с решенията към всяка една от задачите можете да видите тук }
1. Write a script that allocates array of 20 integers and initializes each element by its index multiplied by 5. Print the obtained array on the console.
ОБЯСНЕНИЕ: Задачата е същата като от C# курса, ако решите да преизползвате кода си внимавайте да смените myArr.Length на myArr.lengt… На пръв поглед няма разлика, но пропъртито „lengt“ за достъпване дължината на масивите в JavaScript се изписва с малко „l“ (както и всички пропъртита в JS). Ако не го смените, кодът ви няма да работите и ще се чудите защо, тъй като JS кода не гърми и не хвърля ексепшъни по време на писане и компилиране на кода.
2. Write a script that compares two char arrays lexicographically (letter by letter).
ОБЯСНЕНИЕ: За да решим тази задача първо нека уточним какво се има в предвид под лексикографско сравнение на чаровете в масивите. Ето какво пише в учебника „Въведение в програмирането“ като разяснение към тази задача: „При лексикографската наредба символите се сравняват един по един като се започва от най-левия. При несъвпадащи символи по-рано е масивът, чийто текущ символ е по-рано в азбуката. При съвпадение се продължава със следващия символ вдясно. Ако се стигне до края на единия масив, по-краткият е лексикографски по-рано. Ако всички съответни символи от двата масива съвпаднат, то масивите са еднакви и никой о тях не е по-рано в лексикографската наредба.“ При C# тази задача си е бая занимавка, но тук в JavaScript решението я е много лесно тъй като, ако просто сравним „abc“ == „abc“ ще получим true. Ако сравним „abc“ < „abc“ или „abc“ > „abc“ получаваме false. Но ако сравним „abc“ < „akl“ ще получим true!!! Т.е. стринга „abc“ лексикографски е по-напред/по-малък е от „akl“. Или казано с други думи, JavaScript има способността автоматично да сравнява лексикографски чаровете.
3. Write a script that finds the maximal sequence of equal elements in an array. Example: {2, 1, 1, 2, 3, 3, 2, 2, 2, 1} ->> {2, 2, 2}.
ОБЯСНЕНИЕ: Алгоритъмът и обясненията са същите като от C# домашното. Накрая когато принтираме съобщението „The longest sequence is of elements is „, увеличаваме променливата longestSequence с едно, тъй като в хода на проверката с променливата counter не сме добавили последното число от най-дългата поредица.
4. Write a script that finds the maximal increasing sequence in an array. Example: {3, 2, 3, 4, 2, 2, 4} ->> {2, 3, 4}.
ОБЯСНЕНИЕ: Алгоритъмът е аналогичен на този от C#.
5. Sorting an array means to arrange its elements in increasing order. Write a script to sort an array. Use the „selection sort“ algorithm: Find the smallest element, move it at the first position, find the smallest from the rest, move it at the second position, etc. Hint: Use a second array.
ОБЯСНЕНИЕ: Идеята тук е да не използваме готовите методи за сортиране, а сами да си разпишем алгоритъма. Инициализираме си масив с несортирани стойности и го принтираме. След това пускаме два форцикъла и сравняваме елементите един по един, когато намерим такъв който е най-малък от останалите го местим на предна позиция и продължаваме проверките за останалите елеминти.
6. Write a program that finds the most frequent number in an array. Example: {4, 1, 1, 4, 2, 3, 4, 4, 1, 2, 4, 9, 3} ->> 4 (5 times).
ОБЯСНЕНИЕ: Алгоритъмът е същия като от C# задачата – първо си сортираме (препоръчително е да си разпишете свой алгоритъм, не да ползвате готовия) масива,
после вървим по елементите му в търсене на най-голямото повторение.
7. Write a program that finds the index of given element in a sorted myArray of integers by using the binary search algorithm (find it in Wikipedia).
ОБЯСНЕНИЕ: Бинарното търсене е много полезен алгоритъм, когато трябва да се търси елемент в много големи масиви. За да работи много е важно да се отбележи, че масивът трябва да бъде сортиран! Неговата бързина на търсене се изразява в това, че той започва търсенето си, не от началото на масива, а от неговата среда. В зависимост от това дали елемента е равен на средния елемент, по-малък е или по голям, се определя в каква посока ще продължи търсенето (наляво или надясно в масива), ако не сме големи късметлии да се окаже, че търсения елемент е точно средния и сме го нацелили от раз. Объркващо звучи, затова може да прегледате това разяснително видео тук – https://www.youtube.com/watch?v=j5uXyPJ0Pew
Алгоритъмът е сравнително лесен, само го нагаждаме до особеностите на JS. За да накараме .sort() да сортира правилно числата (не лексикографски, както е по подразбиране), трябва да му зададете като параметър някаква сортираща функция, чрез която да се предефинират правилата за сортиране, така че те да са приложими адекватно за числа. Също така е важно да преди да получим стойността на променливата iMidpoint, преди това да сме парснали към INT, за да можем получения резултат след делението да е целочислен. Прието е след изпълнение на binarySearch-а, функцията да върне -1, ако търсения елемент няма позиция вътре в масива.
Кодът към всяка една от задачите можете да видите тук.