Пустые стаканы с водой располагаются в следующем порядке:
Когда вы наливаете жидкость в 1-й стакан, если он полон, то дополнительная жидкость будет поступать в стаканы 2 и 3 в равных количествах. Когда стакан 2 заполнен, лишняя жидкость будет переливаться в 4 и 5 и так далее.
Учитывая, что N литров жидкости и максимальная вместимость каждого стакана составляет 1 литр, укажите количество жидкости, присутствующей в любом стакане, если вы опорожняете N литров жидкости, наливая в стакан, выполняя функцию, getWaterInBucket(int N, int X)
где X - номер стекла. Так, например, если я хочу иметь 4 литра в начале, и я хочу найти воду в стакане 3, функцияgetWaterInBucket(4, 3)
Как мне решить это программно? Я попытался найти математическое решение, используя треугольник Паскаля. Это не сработало. Я считал, что это дерево, поэтому я могу добавить такой параметр, getWaterInBucket(BTree root, int N, int X)
а затем попробовать какое-то рекурсивное решение для каждого уровня, но параметры не разрешены в этой задаче. Есть ли что-то очевидное, какая-то хитрость?
источник
Ответы:
Вам просто нужно смоделировать заливку, что-то вроде
В его нынешнем виде это не дерево. Поскольку разные стаканы вливаются в одни и те же стаканы, это мешает им быть деревом.
источник
return glasses[N-1]
, потому что числа стекла начинаются с 1 вместо 0.Вот как я мог бы ответить на этот вопрос в ситуации интервью (я не видел этот вопрос раньше, и я не смотрел на другие ответы, пока у меня не было своего решения):
Сначала я попытался выяснить это (что вы назвали «математическим решением»), и когда я добрался до стекла 8, я понял, что это будет сложнее, чем казалось, потому что стекло 5 начинает переливаться перед стеклом 4. В этот момент я решил пойти по маршруту рекурсии (просто к вашему сведению, многие вопросы по программированию требуют рекурсии или индукции).
Думая рекурсивно, проблема становится намного легче: сколько воды в стакане 8? Половина суммы, которая пролилась из стаканов 4 и 5 (пока она не заполнится). Конечно, это означает, что мы должны ответить, сколько разлилось из стаканов 4 и 5, но, оказывается, это тоже не сложно. Сколько разлилось из стекла 5? Половина из большого количества разлилась из стаканов 2 и 3, минус литр, который остался в стакане 5.
Решение этого полностью (и грязно) дает:
В этот момент (или когда я писал это) я бы сказал интервьюеру, что это не идеальное решение в производстве: дублирующий код между
howMuchSpilledOutOf()
иgetWaterInBucket()
; должно быть центральное местоположение, которое сопоставляет ведра с их «кормушками». Но в интервью, где скорость и точность реализации более важны, чем скорость выполнения и ремонтопригодность (если не указано иное), это решение является предпочтительным. Затем я предложил бы реорганизовать код, чтобы он был ближе к тому, что я считаю качеством производства, и позволил интервьюеру принять решение.Последнее замечание: я уверен, что мой код где-то содержит опечатку; Я бы также упомянул об этом интервьюеру и сказал, что чувствую себя более уверенно после рефакторинга или юнит-тестирования.
источник
this isn't the ideal solution
.Думать об этом как о проблеме дерева - это красная сельдь, это действительно ориентированный граф. Но забудьте об этом все.
Думайте о стакане где-нибудь ниже верхнего. Над ним будет один или два стакана, которые могут перетекать в него. При соответствующем выборе системы координат (не волнуйтесь, смотрите конец) мы можем написать функцию, чтобы получить «родительские» очки для любого данного стекла.
Теперь мы можем придумать алгоритм, позволяющий получать количество жидкости, наливаемой в стакан, независимо от переполнения из этого стакана. Ответ, однако, заключается в том, что в каждого родителя наливается много жидкости, минус количество, хранящееся в каждом родительском стакане, деленное на 2. Просто сложите сумму для всех родителей. Записываем это как фрагмент python тела функции amount_poured_into ():
Max () должен гарантировать, что мы не получим отрицательное количество переполнения.
Мы почти закончили! Мы выбираем систему координат с 'y' вниз по странице, очки первой строки равны 0, вторая строка равна 1 и т. Д. Координаты 'x' имеют ноль под стеклом верхнего ряда, а вторая строка имеет координаты x -1 и +1, третий ряд -2, 0, +2 и т. Д. Важным моментом является то, что левое или самое правое стекло на уровне у будет иметь абс (х) = у.
Оборачивая все это в python (2.x), мы имеем:
Таким образом, чтобы получить сумму на самом деле в стакане при p, используйте amount_in (total, p).
Это не ясно из ОП, но немного о «вы не можете добавить параметры» может означать, что на исходный вопрос необходимо ответить в терминах показанных чисел стекла . Это решается путем записи функции сопоставления номеров витрин во внутреннюю систему координат, использованную выше. Это неудобно, но можно использовать итеративное или математическое решение. Легко понять итеративную функцию:
Теперь просто переписайте приведенную выше функцию amount_in (), чтобы принять номер стекла:
источник
Интересный.
Это требует подхода моделирования.
какие отпечатки (для 6 литров):
который кажется правильным.
источник
Это биноминальная функция. Соотношение воды между стаканами уровня N может быть обнаружено с использованием nCr для каждого стекла в уровне. Кроме того, общее количество очков до уровня N является суммой от 1 до (N - 1), формула, по которой вы сможете найти ее достаточно легко. Таким образом, учитывая X, вы должны быть в состоянии определить его уровень и использовать nCr для проверки соотношений очков для этого уровня и, таким образом, определить, сколько воды находится в X, если в любом случае достаточно литров, чтобы спуститься к X.
Во-вторых, ваша идея использования BTree прекрасна, просто BTree является внутренней переменной, а не внешним параметром.
Итак, если вы изучали эту математику в своем образовании (здесь, в Великобритании, ее преподают до университета), вы сможете решить ее без особых проблем.
источник