951 просмотр
От 21 февраля

Решения для задач с собеседований по Swift

1

Алгоритм бинарного поиска

Бинарный поиск (Binary Search) - это эффективный алгоритм для поиска значения в отсортированном массиве. Принцип алгоритма очень прост. Мы всегда имеем дело с упорядоченным массивом. Это позволяет прибегать к хитрости - на каждой итерации цикла, который мы запускаем, мы вычисляем индекс среднего элемента. Этот элемент сравниваем с искомым. Если элемент из середины массива оказался меньше, чем тот, что мы ищем, значит нужный нам находится правее по массиву, ведь массив упорядочен. Соответственно, нам нужно перейти в следующую итерацию цикла, "оставляя" ей лишь правую часть массива - в ней снова будет найден средний элемент и алгоритм повторится. Если же элемент из середины массива оказался больше искомого, то мы переходим к следующей итерации, отбрасывая правую часть массива, а оставляя левую. Если же элемент совпадает с искомым, мы выходим из цикла. func binarySearch(array: [T], key: T) -> Int? { var lowerBound = 0 var upperBound = array.count - 1 while lowerBound <= upperBound { let mid = (lowerBound + upperBound) / 2 if array[mid] == key { return mid } else if array[mid] < key { lowerBound = mid + 1 } else { upperBound = mid - 1 } } return nil } Термины: target - искомое значение index - индекс искомого значения. left, right - левый и правый индексы, определяющие область нахождения. mid - индекс элемента в центре текущего поля поиска, который будет сравниваться с целевым значением. Эта реализация основана на использовании цикла и позволяет найти индекс искомого фрагмента в отсортированном массиве или вернуть nil, если искомое значение не найдено.

2

Реализуйте оператор возведения в степень (^^)

Постановка: У Swift есть набор предопределенных операторов для арифметических и логических действий. Он также позволяет создавать свои собственные операторы, как унарные, так и бинарные. Определите и реализуйте собственный оператор возведения в степень ^^ по следующим требованиям: - принимает в качестве параметров два Int - возвращает результат возведения первого параметра в степень второго - корректно обрабатывает порядок алгебраических операций - игнорирует возможные ошибки переполнения Решение: Создание нового оператора происходит в два этапа: объявление и реализация. Объявление использует ключевое слово operator для задания типа (унарный или бинарный), для задания последовательности символов нового оператора, его ассоциативности и старшинства выполнения. Здесь оператор — это ^^ и его тип infix (бинарный). Ассоциативность правая. В Swift нет предопределенного старшинства для возведения в степень. В алгебре возведение в степень должно вычисляться перед умножением/делением. Таким образом, мы создаем пользовательский порядок выполнения, помещая возведение в степень выше умножения. Это объявление: precedencegroup ExponentPrecedence { higherThan: MultiplicationPrecedence associativity: right } infix operator ^^: ExponentPrecedence Это реализация: func ^^(base: Int, exponent: Int) -> Int { let l = Double(base) let r = Double(exponent) let p = pow(l, r) return Int(p) }

3

Расширение Array для подсчёта количества уникальных значений

Вариант 1: extension Array where Element: Comparable { func countUniques() -> Int { let sortedValues = sorted() let initial: (Element?, Int) = (.none, 0) let reduced = sortedValues.reduce(initial) { ($1, $0.0 == $1 ? $0.1 : $0.1 + 1) } return reduced.1 } } Вариант 2: func countUniques<T: Hashable>(_ array: Array<T>) -> Int { return Set(array).count }

4

Максимально упростите замыкание

Постановка: Этот код сортирует массив по алфавиту. Максимально упростите замыкание. var animals = ["fish", "cat", "chicken", "dog"] animals.sort { (one: String, two: String) -> Bool in return one < two } print(animals) Решение: Swift автоматически определяет тип параметров замыкания и возвращаемый тип, так что вы можете убрать их: animals.sort { (one, two) in return one < two } Вы можете заменить имена параметров использованием нотации $i: animals.sort { return $0 < $1 } Замыкания, состоящие из одного оператора, могут не содержать ключевое слово return. Значение последнего выполненного оператора становится возвращаемым результатом замыкания: animals.sort { $0 < $1 } Наконец, так как Swift знает, что элементы массива соответствуют протоколу Equatable, вы можете просто написать: animals.sort(by: <) Есть и более короткий вариант: animals.sort() Он сортирует по возрастанию, работает для типов, реализующих Comparable.

Логотип ДевстанцииАвторизуйтесь, чтобы просматривать следующий контент
6

Поменяйте местами две переменные без третьей

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
7

Перепишите функцию divide

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
8

Реализуйте инициализацию при помощи литералов

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
9

Сконвертируйте отрицательное целое в UInt с сохранением его представления в памяти

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
10

Найдите дубликат без дополнительной переменной

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
11

Определите тип бинарного дерева

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
12

Найдите целое число, которое встречается больше 50% раз

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
13

Реализуйте простейший Singleton

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
14

Реализуйте паттерн "Абстрактная фабрика"

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
15

Реализуйте паттерн "Строитель"

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
16

Реализуйте паттерн "Фабричный метод"

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
17

Реализуйте паттерн "Прототип"

Логотип ДевстанцииАвторизуйтесь, чтобы получить доступ
Хотите стать частью сообщества Девстанции?
Вступайте в наш чат в Telegram

Также в этой категории

Вопросник
  88 вопросов

100 вопросов для собеседования Swift

Ответы на вопросы для собеседования Swift-разработчика

679 просмотров
От 9 февраля
Викторина
  14 вопросов

Викторина на знание Swift

Вопросы для проверки Swift-разработчика

38 просмотров
От 9 февраля

Топ тредов

Gravatar for 1847arsen
Arsen
: Задача в Python под названием "Кратчайший путь в матрице"

Последнее сообщение:
Gravatar for 1847arsen
Arsen
: Ошибка на 3 тесте # Ожидаемый результат: 2 а должен быть 1
1 сообщение
31 просмотр

Gravatar for 1233freddypopa
freddypopa
: Добавить чекбокс, который отвечает за показ ранее тронутых задач (черновик)

Последнее сообщение:
: Отличная идея! Возьмём её на заметку!
1 сообщение
127 просмотров

: Предложите идею и получите спонсорский доступ на месяц

Последнее сообщение:
Gravatar for 1236borisops
Borisops
: Добавить темную тему) что бы можно было посмотреть сложность алгоритма и добавить тэги.
10 сообщений
342 просмотра

Все категории