Напишите решение задачи поиска уникального числа в массиве
Что проверяют
Услышите ли вы условие целиком и вспомните ли решение без дополнительной памяти. Плюс чисто свифтовая часть: что вернуть на пустом входе и как не соврать с опционалом.
Как отвечать
Сначала уточните формулировку: обычно имеется в виду, что одно число встречается ровно один раз, а все остальные ровно дважды. Тогда работает XOR, потому что пары взаимно уничтожаются:
func singleNumber(_ nums: [Int]) -> Int? {
guard !nums.isEmpty else { return nil }
return nums.reduce(0, ^)
}O(n) по времени, O(1) по памяти. Если условие слабее и повторы произвольные, XOR неприменим, и нужен словарь частот:
let counts = Dictionary(nums.map { ($0, 1) }, uniquingKeysWith: +)
let single = counts.first { $0.value == 1 }?.keyЭто уже O(n) памяти, и размен стоит назвать вслух: интервьюер чаще всего именно его и хочет услышать. Упомяните, что порядок обхода словаря не определён, поэтому при нескольких одиночках результат будет произвольным.
Где спотыкаются
Возвращают nil, когда свёртка дала ноль. Ноль сам может оказаться искомым числом, например в наборе [2, 2, 0]. Пустой вход отсекается отдельной проверкой на isEmpty, а не по значению результата.
Применяют XOR к задаче, где повторов не два. Набор [1, 1, 1, 2] ломает решение молча, без ошибки, и именно этим уточнением интервьюер проверяет, поняли вы приём или заучили.
Спотыкаются на самом Swift: объявляют пустой массив литералом без аннотации типа, и компилятор не может вывести тип элемента, либо подставляют строку в оператор ?? к значению типа Int?. И то и другое не собирается, а задачу часто решают прямо в редакторе.