Для заданного массива целых чисел выполните операции над массивом. Вернуть результирующий массив после применения всех операций в указанном порядке. Каждая операция содержит два индекса. Переверните подмассив между этими индексами, начинающимися с нуля, включительно.
1: обр.: [1, 2, 3] 1: операции: [[0, 2], [1, 2], [0, 2]]
2: обр.: [640, 26, 276, 224, 737, 677, 893, 87, 422, 30] 2: операции: [[0, 9], [2, 2], [5, 5], [1, 6], [5, 6], [5, 9], [0, 8], [6 , 7], [1, 9], [3, 3]]
Вот что я пробовал, но, похоже, не работает
func performOperations(arr: [Int], operations: [[Int]]) -> [Int] {
// Write your code here
var arr = arr
var operations = operations
print("arr is : \(arr)")
print("operations is : \(operations)")
var v1 = 0
var v2 = 0
var count = 0
for (i, v) in operations.enumerated() {
v1 = i
for j in v {
v2 = j
if v1 > v2 {
v2 = i
v1 = j
}
// arr[v1] = arr[v2]
// arr[v2] = arr[v1]
}
count = v2 - v1 + 1
}
for offset in 0..<count/2 {
let f = v1 + offset
let s = v2 - offset
var o = arr[f]
var o2 = arr[s]
arr[s] = o
arr[f] = o2
}
return arr
}
Я обновил вопрос, чтобы он содержал ожидаемый результат и мой собственный результат.





Одно из решений состоит в том, чтобы разделить массив на 3 части для каждой операции, что находится перед первым индексом операции, что после второго индекса и что между ними, а затем объединить 3 части после того, как средний был изменен.
func performOperations(array: [Int], operations: [[Int]]) -> [Int] {
var result = array
for op in operations {
let reversed = Array(result[op[0]...op[1]].reversed())
let prefix = result[result.startIndex..<op[0]]
let suffix = result[op[1] + 1..<result.endIndex]
result = prefix + reversed + suffix
}
return result
}
Они могут быть длиннее.
operations is : [[0, 9], [2, 2], [5, 5], [1, 6], [5, 6], [5, 9], [0, 8], [6, 7], [1, 9], [3, 3]]arr is : [640, 26, 276, 224, 737, 677, 893, 87, 422, 30]@King, а ожидаемый результат?
Я добавил изображение ожидаемого результата для этого случая к вопросу
@King Сначала я неправильно понял требования, поэтому обновил свой ответ новой версией.
Это приведет к излишней замене элемента самим собой, когда индексы операции равны. Это также заменит весь массив, а не просто заменит элементы, которые необходимо менять местами на каждой итерации. Не забывайте также, что это приведет к сбою, если индексы недействительны или если второй индекс ниже первого.
Функциональный подход к этой задаче будет заключаться в создании переменной копии исходного массива, повторении каждой операции, убедившись, что каждая из них имеет два элемента (индекса), а первый индекс меньше второго. Затем вы можете просто заменить поддиапазон коллекции обратной последовательностью:
func performOperations(arr: [Int], operations: [[Int]]) -> [Int] {
var arr = arr
operations.forEach {
guard $0.count == 2, $0[0] < $0[1] else { return }
arr.replaceSubrange($0[0]...$0[1], with: arr[$0[0]...$0[1]].reversed())
}
return arr
}
let arr = [640, 26, 276, 224, 737, 677, 893, 87, 422, 30]
let operations = [[0, 9], [2, 2], [5, 5], [1, 6], [5, 6], [5, 9], [0, 8], [6, 7], [1, 9], [3, 3]]
performOperations(arr: arr, operations: operations) // [87, 422, 30, 737, 224, 677, 893, 640, 26, 276]
Каков ожидаемый результат и почему это помечено несколькими языками программирования?