Поскольку мне нравилось программирование в Scala, для моего интервью с Google я попросил их дать мне вопрос о стиле Scala/функциональном программировании. Вопрос о функциональном стиле Scala, который я получил, был следующим:
У вас есть две строки, состоящие из буквенных символов, а также специальный символ, представляющий символ обратного пространства. Позвольте называть этот символ обратного пространства '/'. Когда вы попадаете на клавиатуру, вы вводите эту последовательность символов, включая символ backspace/delete. Решение, которое вы должны реализовать, должно проверить, производят ли две последовательности символов один и тот же вывод. Например, "abc", "aa/bc". "abb/c", "abcc/", "/abc" и "//abc" производят одинаковый вывод "abc". Поскольку это вопрос Scala/функционального программирования, вы должны реализовать свое решение в идиоматическом стиле Scala.
Я написал следующий код (может быть, это не совсем то, что я написал, я просто ушел из памяти). В основном я просто линейно перехожу через строку, добавляя символы в список, а затем сравниваю списки.
def processString(string: String): List[Char] = {
string.foldLeft(List[Char]()){ case(accumulator: List[Char], char: Char) =>
accumulator match {
case head :: tail => if(char != '/') { char :: head :: tail } else { tail }
case emptyList => if(char != '/') { char :: emptyList } else { emptyList }
}
}
}
def solution(string1: String, string2: String): Boolean = {
processString(string1) == processString(string2)
}
Все идет нормально? Затем он спросил о сложности времени, и я ответил на линейное время (потому что вы должны обрабатывать каждый символ один раз) и линейное пространство (потому что вам нужно скопировать каждый элемент в список). Затем он попросил меня сделать это в линейном времени, но с постоянным пространством. Я не мог придумать, как это сделать, что чисто функционально. Он попробовал использовать функцию в библиотеке коллекций Scala, например, "zip" или "map" (я явно помню, как он говорил слово "zip").
Вот что. Я думаю, что физически невозможно сделать это в постоянном пространстве без какого-либо изменчивого состояния или побочных эффектов. Как будто я думаю, что он перепутал вопрос. Как вы думаете?
Можете ли вы решить это в линейном времени, но с постоянным пространством?