Сегодня утром я читал Steve Yegge's: When Polymorphism Fails, когда я столкнулся с вопросом, что его сотрудник использовал, чтобы спросить потенциальных сотрудников, когда они пришли на собеседование в Amazon.Оценка выражения и движение по дереву с использованием полиморфизма? (ala Steve Yegge)
В качестве примера полиморфизма действия, давайте посмотрим на классический «Eval» интервью вопрос, который (как насколько я знаю), был доставлен в Amazon Рон Браунштейн. Вопрос в том, довольно богатая, как это удается зонда широкий спектр важных навыки: дизайн ООП, рекурсии, бинарные деревья, полиморфизм и выполнения типизации, общие навыки кодирования, и (если вы хотите сделать это очень сложно) теория парсинга.
В какой-то момент, кандидат надеюсь, понимает, что вы можете представлять арифметическое выражение в виде двоичного дерева , предполагая, что вы используете только бинарные операторы, такие как «+», «-», «*» , "/". Листовыми узлами являются все номера , а внутренние узлы - всех операторов. Оценка выражения означает движение по дереву. Если кандидат этого не осознает, вы можете мягко привести их к нему, или если необходимо, просто скажите им.
Даже если вы сообщите им, это еще одна проблема .
Первая половина вопроса, который некоторые человек (чьи имена я защита моего вздоха, но их инициалов Вилли Льюис) считает это Требования к работе Если вы хотите звонить Самостоятельно Разработчик И Work at Amazon, на самом деле очень тяжело. Вопрос : как вы переходите от арифметического выражения (например, в строку ), такого как «2 + (2)» в дерево выражений . У нас может быть задание ADJ по этому вопросу в точке .
Вторая половина: допустим это 2 человек проект а, и ваш партнер , который мы будем называть «Вилли», это отвечает за преобразование выражения в строку в дерево. Вы получаете простую часть: вам нужно решить, что классы Вилли должен построить дерево . Вы можете сделать это на любом языке , но убедитесь, что вы выбрали один, или Willie передаст вам сборку . Если он чувствует себя ornery, то будет для процессора, который не является более длинным, произведенным в производстве.
Вы были бы поражены тем, сколько кандидатов boff этот.
Я не отдадим ответ, но Standard Bad Решение предполагает использование выключателя или корпуса даного (или просто хороших старомодных каскадно-КСФ).A Немного лучшее решение включает в себя с использованием таблицы указателей функций, и, возможно, наилучшего решения предполагает использование полиморфизма. I поощрять вас к работе через него когда-нибудь. Забавные вещи!
Итак, давайте попробуем решить эту проблему всеми тремя способами. Как вы переходите от арифметического выражения (например, в строке), такого как «2 + (2)» к дереву выражений, используя cascaded-if's, таблицу указателей функций и/или полиморфизм?
Не стесняйтесь использовать один, два или все три.
[обновление:. Название изменено, чтобы лучше соответствовать тому, что большинство ответов было]
Основываясь на ответе Марка Харриссона, я написал реализацию php – serdarsenay 2013-11-04 00:14:18