Допустим, у нас есть массив:
var scrambledAlphabet = ["B", "C", "D", "E", "H", "F", "G", "A"]
, и мы хотим отсортировать его, переместив два элемента: элемент 7 («A») в местоположение 0 и элемент 4 ( "H") до 7, описанного массивом кортежей:
var moves = [(7, 0), (4, 7)]
Итак, желаемый результат:
[«A», «B», «C», «D», «E», «F», «G», «H»]
Спонтанное, которое легко решить с помощью этого:
var scrambledAlphabet = ["B", "C", "D", "E", "H", "F", "G", "A"]
var moves = [(7, 0), (4, 7)]
for (i, j) in moves {
scrambledAlphabet.insert(scrambledAlphabet.remove(at: i), at: j)
}
print(scrambledAlphabet)
Но не работает. Результат:
[«A», «B», «C», «D», «H», «F», «G», «E»]
Проблема в том, что как только первый элемент перемещается, индекс следующего элемента изменяется. Итак, как лучше всего с этим справиться? Я нахожу это на удивление трудным. Любая помощь приветствуется.
Ограничение состоит в том, что две переменные, scrambledAlphabet
и moves
, должны иметь возможность увеличиваться до любого числа.
И еще одно важное замечание: перемещение по индексу (второе число в кортеже) относится к старому массиву, не вновь созданному. Итак, входные данные ["B", "C", "E", "D", "H", "F", "G", "A"]
и [(7, 0), (4, 7), (3, 2)]
должны привести к:
[«A», «B», «C», «D», «E», «F» , "G", "H"]
Извините за путаницу по поводу этого последнего бита.