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

Решения для задач с собеседований по 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-разработчика

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

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

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

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

Топ тредов

Gravatar for 1773kartan
Kartan
: Задача в JavaScript "Поиск пары чисел по сумме"

Последнее сообщение:
Gravatar for 1773kartan
Kartan
: Тест ожидает, что функция вернёт пустой список [], а не список с элементами [-1, -1], если не удаётс...
1 сообщение
21 просмотр

: Задача в JavaScript "Форматирование текста"

Последнее сообщение:
: Но тогда другой кейс уже противоречит подходу. Вызов: formatText("Мама пошла в магазин", 4) Ожидалос...
3 сообщения
46 просмотров

Gravatar for 1623bbush
bbush
: Задача в JavaScript "Числовая спираль"

Последнее сообщение:
Gravatar for 1773kartan
Kartan
: В матрице размером 4x3 не может быть числа 13, максимальное количество цифр - 12. В тесте ошибка
2 сообщения
103 просмотра

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