Обратные запросы массива

Для заданного массива целых чисел выполните операции над массивом. Вернуть результирующий массив после применения всех операций в указанном порядке. Каждая операция содержит два индекса. Переверните подмассив между этими индексами, начинающимися с нуля, включительно.

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

}

1: Обратные запросы массива 2: Обратные запросы массива

Каков ожидаемый результат и почему это помечено несколькими языками программирования?

Joakim Danielson 14.05.2022 22:15

Я обновил вопрос, чтобы он содержал ожидаемый результат и мой собственный результат.

King 14.05.2022 22:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
83
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Одно из решений состоит в том, чтобы разделить массив на 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
}

Они могут быть длиннее.

King 14.05.2022 22:48
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 14.05.2022 22:48

@King, а ожидаемый результат?

Joakim Danielson 14.05.2022 22:50

Я добавил изображение ожидаемого результата для этого случая к вопросу

King 14.05.2022 22:51

@King Сначала я неправильно понял требования, поэтому обновил свой ответ новой версией.

Joakim Danielson 14.05.2022 23:08

Это приведет к излишней замене элемента самим собой, когда индексы операции равны. Это также заменит весь массив, а не просто заменит элементы, которые необходимо менять местами на каждой итерации. Не забывайте также, что это приведет к сбою, если индексы недействительны или если второй индекс ниже первого.

Leo Dabus 15.05.2022 00:37

Функциональный подход к этой задаче будет заключаться в создании переменной копии исходного массива, повторении каждой операции, убедившись, что каждая из них имеет два элемента (индекса), а первый индекс меньше второго. Затем вы можете просто заменить поддиапазон коллекции обратной последовательностью:

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]

Другие вопросы по теме