extension Collection where Element == Int {
func isFlipMirrored() -> Bool {
let mirrors = [0:0, 1:1, 6:9, 8:8, 9:6]
return zip(self, self.reversed()) // Create tuples of each element and its opposite
.allSatisfy { // Return whether all of them match the rule:
mirrors[$0] == $1 // That the element matches its opposite's mirror
}
}
}
Это не так эффективно, как могло бы быть, но очень просто и точно.Он просто проверяет, что каждый элемент последовательности совпадает с зеркальными элементами в обратном порядке.
Может быть эффективнее проверить только первую половину элементов, но это довольно незначительная оптимизация, которая требуетдополнительные условия, так что я не уверен, будет ли это действительно быстрее для достаточно маленького N. Вам нужно выполнить профилирование, прежде чем усложнять код слишком сильно.
Конечно, просто потому, что он на самом деле не медленнее (т.е.Я не описал это, чтобы знать), это не означает, что интервьюер не будет оплакивать тот факт, что этот код выполняет избыточные проверки.Есть много недоразумений относительно производительности, и все они, кажется, обнаруживаются в вопросах интервьюИтак, давайте порадуем интервьюера и сверим только первую половину списка с последней половиной.
extension Collection where Element == Int {
func isFlipMirrored() -> Bool {
let mirrors = [0:0, 1:1, 6:9, 8:8, 9:6]
// May test one more thing than we technically have to, but fewer conditionals
let midpoint = count / 2 + 1
return zip(self.prefix(midpoint), // Create tuples of the left-half of the list,
self.reversed().prefix(midpoint)) // and the right half
.allSatisfy { // Return whether all of them match the rule:
mirrors[$0] == $1 // that the element matches its opposite's mirror
}
}
}