Це машинний переклад, який може містити помилки!
Quote
“Алгоритм”, слово, яке програмісти використовують, коли не хочуть пояснювати, що вони зробили.
Algoritme?
Що таке алгоритм?
Алгоритм — це логічна функція, яка виконує певну операцію. Отже, ви технічно можете назвати функцію, яка додає два числа, «алгоритмом», але найчастіше алгоритм — це дещо більш складне. Часто алгоритми використовуються для прискорення операцій, які займають багато часу.
Чи потрібно використовувати Python у цих завданнях?
Ні! Ви можете використовувати будь-яку мову програмування, яку ви віддаєте перевагу в цих завданнях.
Вбудовані бібліотеки?
Ідея цих завдань полягає в тому, щоб уникати використання вбудованих бібліотек або спеціальних функцій Python. Наприклад, існує простий “one-liner” для реверсування тексту: text[::-1], але тут ми хочемо, щоб ви спробували вирішити такі завдання без використання цього. Це може статися, що ми згадаємо вбудовану функцію, якщо рішення трохи важко знайти. Це буде позначено ❗.
На практиці має бути повністю можливо вирішити всі ці завдання за допомогою if, for, while та звичайних операцій зі списками.
Як “розробити” алгоритм?
Найчастіше алгоритми розробляються ітеративно. Що це означає?
1. ✅ Спочатку розбийте проблему на менші частини.
- Насамперед подумайте про найважливіше, що вам потрібно для роботи алгоритму
- Чи повинен він повертати значення? Логічне значення (
boolean)? Список? - Чи потрібні мені якісь допоміжні функції?
- Чи повинен він повертати значення? Логічне значення (
2. ❓ Чи є якісь “крайні випадки”?
- Що відбувається, якщо ви вставляєте порожній список або текст?
3. ✅ Почніть з того, що просто спробуйте створити рішення
4. ✅ Перевірте, чи алгоритм працює добре за часом виконання
- Спробуйте більші вхідні дані, чи займає це багато часу?
5. ❓ Подумайте про своє рішення, чи потрібні вам усі кроки, які ви використовували?
- Чи всі
if-перевірки необхідні? - Якщо у вас більше одного
for-циклу, чи є якісь очевидні способи перетворити це на одинfor-цикл?- Це відрізняється, якщо у вас вкладені цикли або цикли один за одним. Цикли, що йдуть один за одним, часто можна уникнути.
6. ✅ Подумайте про екстремальні сценарії з вхідними даними:
- Приклад з числами: великі числа, малі числа, від’ємні числа
- Приклад тексту: багато тексту, багато маленьких слів, додаткові пробіли, великі та малі літери.
7. ❓ Чи корисно використовувати псевдо-код для кращого розуміння логіки?
Завдання 1 - З’ясувати, чи містить список задане число
Створіть алгоритм (функцію), який з’ясовує, чи містить список задане число. Він повинен повертати True або False залежно від того, чи існує число в списку чи ні.
Ось список з тестовими даними:
Test-data for algoritme:
| Test-Data | Сjekk | Svar |
|---|---|---|
[1, 2, 3, 4, 5, 6, 7, 8, 9] | 5 | True |
[1, 2, 3, 4, 5, 6, 7, 8, 9] | 10 | False |
[2, 3, 5, 7, 11, 13, 17, 19, 23] | 2 | True |
[2, 3, 5, 7, 11, 13, 17, 19, 23] | 10 | False |
[-1, 0, 1, -34, 321, 22, 98, -214] | -214 | True |
[-1, 0, 1, -34, 321, 22, 98, -214] | 0 | True |
[-1, 0, 1, -34, 321, 22, 98, -214] | 2 | False |
Tips til framgangsmåte
- Прийміть список та значення списку у функцію. У цьому завданні це будуть числа, але може бути текст.
- Використовуйте
for-цикл для перебору списку. - Якщо число дорівнює перевірочному числу, поверніть
True. - Якщо
for-цикл завершено і ви не знайшли його, повернітьFalse.
Svaret (i python)
def exists_in_list(the_list, check):
for number in the_list:
if number == check:
return True
return False
Завдання 2 - Підсумовування
Створіть алгоритм, який підсумовує список чисел.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], дає відповідь21.[5, 1, 23, 68, 22, 13, 4], дає відповідь136[3, 3, -3, -3, 3]дає відповідь3. Можливо, ви можете ігнорувати від’ємні числа та дати відповідь9.
Tips til framgangsmåte
- Прийміть список у функцію
- Збережіть тимчасову суму як
0. - Використовуйте
for-цикл для перебору списку. returnсуму списку.
Svaret (i python)
def sum_list(numbers):
total = 0
for num in numbers:
total += num
return total
Завдання 3a - Максимальне значення у списку
Створіть алгоритм, який знаходить найбільше значення у списку.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], дає відповідь6.[6, 17, 227, 1, 23, 42, 12], дає відповідь227[2, -2, 2, -2, -2, 2]дає відповідь2.
Tips til framgangsmåte
- Прийміть список у функцію
- Призначте тимчасове значення першому елементу списку.
- Використовуйте
for-цикл для перебору списку та порівняння зі значенням, яке ви встановили в пункті 2. - Якщо значення більше, встановіть тимчасове значення на нове значення.
returnце тимчасове значення.
Svaret (i python)
def find_max(numbers):
largest = numbers[0]
for num in numbers:
if num > largest:
largest = num
return largest
Завдання 3b - Якщо список порожній?
Додайте перевірку, яка тестує, чи містить список елементи. Якщо ні, поверніть None.
Svaret (i python)
def find_max(numbers):
if len(numbers) == 0:
return None
largest = numbers[0]
for num in numbers:
if num > largest:
largest = num
return largest
Завдання 4 - Підрахунок кількості заданого елемента в списку
Створіть алгоритм, який підраховує кількість заданого елемента в списку.
Test-data for algoritme:
["apple", "banana", "orange", "apple", "apple", "banana"]зappleдає відповідь 3.[1, 4, 5, 2, 4, -3, -4, 4, 2, 4, 221, 3, 1, 1, 4, 1, 12, 33, 4, 4, 2, -4, 1, 4]з4дає відповідь8.["cat", "dog", "cat", "mouse", "cat", "dog", "dog"]зdogдає відповідь3.[7, 7, 2, 9, 7, 1, 0, 7, 3, 7, 9]з7дає відповідь5.["red", "blue", "green", "red", "yellow", "red"]зredдає відповідь3.[10, -2, -2, -2, 5, 10, 10, -2]з-2дає відповідь4.
Tips til framgangsmåte
- Прийміть список та перевірочне значення у функцію
- Почніть з тимчасової лічильної змінної, встановленої на 0.
- Пройдіть по списку за допомогою циклу
for. - Якщо елемент дорівнює перевірці, збільште лічильну змінну на 1.
- Поверніть лічильну змінну.
Svaret (i python)
def count(the_list, check):
count = 0
for element in the_list:
if element == check:
count += 1
return count
Завдання 5 - Розвернути string, текст
Створіть алгоритм, який розвертає заданий string.
Test-data for algoritme:
Hello there!стає!ereht olleH.heisann alle sammenстаєnemmas ella nnasiehPythonстаєnohtyPracecarстаєracecar12345abcстаєcba54321god morgenстаєnegrom dog
Tips til framgangsmåte
- Прийміть
stringу функцію - Створіть тимчасову змінну для зберігання порожнього
string. - Пройдіть по тексту за допомогою
for-циклу зrange. Тут можна пройти по списку назад, але можна вирішити цю задачу, рухаючись вперед по списку. - Додайте кожен символ до тимчасової змінної послідовно.
- Поверніть тимчасовий текст.
Svaret (i python)
def reverse(text):
result = ""
# Цей рядок трохи складний, але він починається
# з кінця, йде (включно) до 0 (записуючи
# -1 як кінець), і рахує вниз на 1 кожного разу
for i in range(len(text) - 1, -1, -1):
result += text[i]
return result
Можливо, ви можете використати алгоритм, який додає на початок замість цього:
def reverse(text):
result = ""
for i in range(0, len(text)):
# додати на початок замість цього
result = text[i] + result
return result
Завдання 6 - Алгоритм паліндрому
Створіть алгоритм, який перевіряє, чи є задане слово паліндромом. Приклади паліндромів: abba, racecar, regninger.
Tips til framgangsmåte
- Створіть функцію, яка приймає текст для перевірки.
- Використовуйте
for-цикл, щоб перевірити, чи однакові літери з кожного боку тексту. - Поверніть
False, якщо літера не збігається, якщо всі збігаються (for-цикл завершується), повернітьTrue.
Екстра:
Чи бачите ви, як можна зробити алгоритм вдвічі швидшим?
Hint
Вам потрібно перевіряти лише половину!
Відповідь (в python)
def palindrome(text):
for i in range(0, len(text)):
if text[i] != text[len(text) - i - 1]:
return False
return True
Швидший алгоритм
def palindrome(text):
for i in range(0, int(len(text) / 2)):
if text[i] != text[len(text) - i - 1]:
return False
return True
Завдання 7 - Перевірка, чи відсортований список
Створіть алгоритм, який перевіряє, чи відсортований список. Найпростіший спосіб перевірити це – почати з початку і порівнювати, чи наступний елемент є “більшим”. Якщо елемент не є “більшим”, то список не відсортований.
Test-data for algoritme:
[1, 2, 3, 4, 5, 6], дає відповідьTrue.[6, 17, 227, 1, 23, 42, 12], дає відповідьFalse[2, -2, 2, -2, -2, 2]дає відповідьFalse.[2, 2, 3, 4, 4, 6], дає відповідьTrue.[12, 23, 34, 45, 56, 67], дає відповідьTrue.
Tips til framgangsmåte
- Створіть функцію, яка приймає список
- Використовуйте
for-цикл, щоб пройти через весь список (використовуйте range до довжини списку, мінус 1len(list) - 1) - Порівняйте елемент \(n\) з \(n + 1\), тобто поточний елемент з наступним елементом.
- Якщо \(n\) менше за \(n + 1\), перейдіть до наступного порівняння.
- Якщо це не менше, а більше, то список не відсортований. Поверніть
Falseтут. - Якщо ви досягнете кінця, то список відсортований, поверніть
True.
Svaret (i Python)
def is_sorted(the_list):
for i in range(len(the_list) - 1):
if the_list[i] > the_list[i + 1]:
return False
return True
Завдання 8 - Перемішування
Створіть алгоритм, який перемішує список речей. Існує багато способів це зробити, але один з хороших – це так званий алгоритм перемішування Фішера-Йетса. Ви можете прочитати більше про це тут Wikipedia.
Test Data
["a", "b", "c", "d", "e"]→ може стати наприклад["c", "e", "a", "d", "b"][1, 2, 3, 4, 5, 6]→ може стати наприклад[4, 1, 6, 3, 2, 5]["apple", "banana", "orange"]→ може стати наприклад["orange", "apple", "banana"]["x"]→ залишається["x"][]→ залишається[]
Вона працює так:
Алгоритм
- Створіть функцію, яка приймає список чисел
- Створіть новий порожній список, який зберігатиме змішаний результат.
- Використовуйте
randomдля вибору випадкового індексу в списку. - Додайте цей елемент до порожнього списку та видаліть його зі старого
- Поверніть новий список з функції
Svaret (i Python)
import random
def shuffle(the_list):
shuffled = []
while len(the_list) > 0:
i = random.randrange(0, len(the_list))
shuffled.append(the_list[i])
the_list.pop(i)
return shuffled
Завдання 9 - Bogo-sort
У цьому завданні вам потрібно створити (практично) жахливий, але надзвичайно простий алгоритм сортування. Він надзвичайно поганий, коли мова йде про великі списки (з більш ніж 12-13 елементами він займе вічність). На Рівні 2 ми створимо кращий алгоритм сортування, bubble-sort.
Test Data
[3, 1, 2]→[1, 2, 3][5, 4, 3, 2, 1]→[1, 2, 3, 4, 5][10, 7, 8, 2]→[2, 7, 8, 10][1, 1, 1]→[1, 1, 1][9, 3, 6, 3, 9]→[3, 3, 6, 9, 9][0, -1, 4, -2]→[-2, -1, 0, 4]
Алгоритм працює так:
Алгоритм
- Створіть функцію, яка приймає список невідсортованих чисел
- Перемішайте список випадково (використовуйте shuffle із завдання 8).
- Перевірте, чи список відсортовано (використовуйте перевірку, яку ви створили в завданні 7).
- Якщо список не відсортовано, повторіть кроки 2 і 3.
- Повторюйте, поки список не буде відсортовано, потім поверніть
Просто кажучи: bogo-sort перемішує весь список і сподівається, що він буде відсортовано.
Підказка: За бажанням використовуйте shuffle із завдання 8, щоб створити невпорядкований список для вашого алгоритму.
Svaret (i Python)
def bogo_sort(the_list):
while not is_sorted(the_list):
the_list = shuffle(the_list)
return the_list
Завдання 10a - Пошук тексту - “підрядок” (Складно!)
Створіть алгоритм, який може знайти ключове слово в тексті. Тобто, якщо у вас є речення, таке як hello there, ви повернете True з ключовим словом hello, False з ключовим словом, таким як hahah. Цей алгоритм повинен працювати з будь-яким вхідним і вихідним значенням.
Використовуйте текстові дані нижче, щоб перевірити, чи працює ваш алгоритм.
Test-data for algoritme:
hello there everyoneзthere=Truehello there everyoneзever=Truehello there everyoneзthen=Falseqwecvyufavsjekkftyergwceryзsjekk=True
Tips til framgangsmåte
- Створіть функцію, яка приймає два
strings, дані та ключове слово. - Використовуйте
for-loop зrangeдля перебору тексту. - Тут важливо подумати, як далеко має йти цикл.
- Створіть тимчасову змінну, яка вказує, чи було знайдено ключове слово, встановіть її на
Trueза замовчуванням. - Використовуйте ще один
for-loop зrangeдля порівняння того, де ви знаходитесь у тексті, з ключовим словом. - Якщо щось у ключовому слові не збігається з тим, що ви перевіряєте зараз, встановіть тимчасову змінну на
Trueіbreakз внутрішнього циклу. - Якщо ви дійдете до кінця тексту, не знайшовши нічого, поверніть
False.
Svaret (i Python)
def search(data, word):
for i in range(0, len(data) - len(word) + 1):
found = True
for j in range (0, len(word)):
if data[i + j] != word[j]:
found = False
break
if found:
return True
return False
Завдання 10b
Додайте також додаткову перевірку, яка слідкує за тим, щоб ключове слово не було довшим за речення.
Tips til framgangsmåte
- Додайте цю перевірку перед
for-циклом.
Svaret (i python)
def search(data, word):
if len(word) > len(data):
return False
for i in range(0, len(data) - len(word) + 1):
found = True
for j in range (0, len(word)):
if data[i + j] != word[j]:
found = False
break
if found:
return True
return False
Завдання 11 - Реверсування слів у реченні (Складно)
Згадайте Завдання 5 про реверсування речення. Переробіть (або почніть спочатку) алгоритм, який реверсує кожне окреме слово в реченні, а потім збирає їх разом.
Test-data for algoritme:
hello there everyoneстаєolleh ereht enoyreveThis is the way it goes!стаєsihT si eht yaw ti !seogdoes this racecar go? of course!стаєseod siht racecar ?og fo !esruoc
Tips til framgangsmåte
- Створіть функцію, яка приймає
string. - ❗Розділіть текст, використовуючи
.split(" "). - Створіть тимчасову змінну для зберігання кінцевого значення.
- Використовуйте
for-цикл для перебору кожного слова. - Використовуйте той самий метод для реверсування, як у Завданні 5
- Використовуйте результат і додайте його до змінної, яку ви створили на кроці 2.
- Поверніть кінцеве значення
Svaret (i Python)
def reverse_words(words):
sentence = words.split(" ")
output = ""
for word in sentence:
reversed_word = ""
for i in range(0, len(word)):
reversed_word = word[i] + reversed_word
output += reversed_word + " "
return output
➕Додатково:
Завдання E1 - Видалення дублікатів зі списку
Припустімо, у вас є список, який містить числа або текст, але ви хочете видалити дублікати. Створіть алгоритм, який видаляє всі дублікати зі списку та містить лише перший з кожного унікального елемента, який існує в списку.
Tips til framgangsmåte
- Почніть з функції, яка приймає список
- Тут ми будемо використовувати
while-цикли замістьfor. Це полегшує роботу в Python, в інших мовахforз лічильниками працює добре. - Створіть лічильну змінну
idx(для індексу, абоi) - Використовуйте
while-цикл, який повинен пройти до довжини списку - Ми будемо порівнювати елемент на
idxз усіма іншими елементами - Створіть лічильну змінну до
jdx(абоj), яка починається зidx + 1 - Порівняйте елемент на
idxз елементом наjdx, якщо вони однакові, видалітьjdxза допомогоюpop(jdx). - ПАМ’ЯТАЙТЕ! Якщо ви видаляєте елемент, список стає меншим, тому ми повинні повернутися на один крок назад за допомогою
jdx -= 1. - Збільште
jdxна 1 і перевірте наступний елемент - Після внутрішнього
while-циклу збільштеidxна 1 і зовнішнійwhile-цикл продовжить роботу - Поверніть у кінці список з видаленими дублікатами
Test Data
[1, 2, 2, 3, 1, 4, 3]→ blir[1, 2, 3, 4]["a", "b", "a", "c", "b", "d"]→ blir["a", "b", "c", "d"][5, 5, 5, 5]→ blir[5]["x", "y", "z", "x", "y", "x"]→ blir["x", "y", "z"][10, -1, 10, -1, 0, 0, 10]→ blir[10, -1, 0]["apple", "apple', "banana", "orange", "apple", "orange", "pear", "apple"]- Має дати:
["apple", "banana", "orange", "pear"]
- Має дати:
Svaret (i Python)
def delete_duplicates(the_list):
idx = 0
while idx < len(the_list):
jdx = idx + 1
while jdx < len(the_list):
if the_list[idx] == the_list[jdx]:
the_list.pop(jdx)
jdx -= 1
jdx += 1
idx += 1
return the_list
Завдання E2 - Counting Sort
Counting sort є одним з небагатьох алгоритмів сортування, які працюють за час \(O(n)\). Тобто, він не займає набагато більше часу, ніж кількість елементів у списку. Дізнайтеся більше про Big O нотацію в Level 2.
Трохи залежить від того, наскільки великий діапазон елементів. Якщо найменше число 0, а найбільше 100000, це може зайняти трохи часу, тому його можна використовувати, якщо діапазон значень невеликий. Він також не працює з від’ємними числами, але алгоритм можна модифікувати, щоб він працював з від’ємними числами.
Алгоритм працює так:
- З’ясуйте, яке найбільше число, збережіть значення цього числа як \(k\).
- Створіть список, який містить \(k + 1\) елементів,
count. - Пройдіть по невпорядкованому списку та використовуйте значення числа як індекс. Тобто, якщо елемент має значення 47, перейдіть до
count[47]і збільште його на 1. - Пройдіть по списку
countі розмістіть кількість чисел, яка є індексом. Наприклад: якщо на індексі 1 стоїть 3, додайте три 1 числа.
Testdata
| Несортовані Дані | Відсортовані Дані |
|---|---|
[7, 3, 9, 1, 4, 3, 0, 6, 8, 6, 2, 1, 9, 0, 5, 4] | [0, 0, 1, 1, 2, 3, 3, 4, 4, 5, 6, 6, 7, 8, 9, 9] |
[12, 13, 15, 0, 8, 15, 8, 5, 16, 8, 0, 20, 4, 9, 17, 16, 1, 3, 6, 15, 5, 2, 3, 1, 19, 13, 17, 5, 3, 10] | [0, 0, 1, 1, 2, 3, 3, 3, 4, 5, 5, 5, 6, 8, 8, 8, 9, 10, 12, 13, 13, 15, 15, 15, 16, 16, 17, 17, 19, 20] |
Tips til framgangsmåte
- Почніть зі створення функції, яка приймає список як вхідні дані
- Створіть порожній список
output - Використовуйте
for-цикл, щоб пройти весь список - Відстежуйте максимальне значення в змінній перед
for-циклом - Оновіть максимальне значення, якщо ви знайдете щось більше
- Створіть список, який містить цю кількість нулів + 1. Приклад: найбільше значення 47, тоді створіть список з 48 нулів. Це можна зробити за допомогою
[0] * (maks + 1), абоforциклу. Назвіть йогоcount. - Пройдіть список ще раз за допомогою
for-циклу - Використовуйте значення елемента як індекс і збільшуйте на 1.
count[value] += 1 - Використовуйте
for-цикл, щоб пройти списокcount. - Використовуйте значення на кожному індексі, щоб додати цю кількість чисел
- Поверніть відсортований список
Svaret (i Python)
def counting_sort(input_list):
output = []
max_val = input_list[0]
for n in input_list:
if n > max_val:
max_val = n
# це створить купу нулів
count = [0] * (max_val + 1)
for n in input_list:
count[n] += 1
for i in range(len(count)):
# використовуйте _ щоб проігнорувати значення
for _ in range(count[i]):
output.append(i)
return output

