對于給定的整數陣列,對陣列執行操作。在按給定順序應用所有操作后回傳結果陣列。每個操作包含兩個索引。反轉這些從零開始的索引之間的子陣列,包括在內。
1:arr 為:[1, 2, 3] 1:操作為:[[0, 2], [1, 2], [0, 2]]
2: arr 是 : [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:
uj5u.com熱心網友回復:
一種解決方案是將每個操作的陣列分成 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
}
uj5u.com熱心網友回復:
此任務的一種功能方法是制作原始陣列的可變副本,迭代每個操作以確保每個操作都有兩個元素(索引)并且第一個索引小于第二個索引。然后你可以用它的反向子序列替換集合子范圍:
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]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/475522.html
