Не так давно я был в интервью, который требовал решения двух очень интересных проблем. Мне интересно, как вы подходите к решениям.
Проблема 1:
Продукт всего, кроме текущего
Напишите функцию, которая принимает в качестве входных данных целые массивы длины len, input и index и генерирует третий массив, результат: result [i] = произведение всего на вход, кроме ввода [index [i]]
Например, если функция вызывается с len = 4, input = {2,3,4,5} и index = {1,3,2,0}, тогда результат будет установлен на {40, 24,30,60}.
ВАЖНО: ваш алгоритм должен выполняться в линейном режиме.
Проблема 2: (тема была в одном из сообщений Jeff)
Разделение карты в случайном порядке
-
Дизайн (на С++ или С#) класса Deck для представления упорядоченной колоды карт, где колода содержит 52 карты, разделенных на 13 рангов (A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K) четырех костюмов: лопастей (?), Сердец (?), Бриллиантов (?) И клубов (?).
-
Основываясь на этом классе, разработайте и внедрите эффективный алгоритм для перетасовки колоды карт. Карты должны быть равномерно перетасованы, то есть каждая карта в оригинальной колоде должна иметь такую же вероятность оказаться в любом возможном положении в перетасованной колоде. Алгоритм должен быть реализован в методе shuffle() класса Deck: void shuffle()
-
Какова сложность вашего алгоритма (как функция числа n карт в колоде)?
-
Объясните, как вы будете проверять, что ваши карты равномерно перетасовываются вашим методом (проверка черного ящика).
P.S. У меня было два часа, чтобы закодировать решения