我正在尝试解决一个非常简单的 HackerRank 测试,我有一些我认为非常干净和重构的代码......但它总是在最后一个测试用例中超时。我下载了它的输入,它是一个非常大的值字符串,但其他人使用更复杂的代码也可以很好地通过。我需要一些帮助来找到一种更清晰的方式来表示我的解决方案(如果有的话)。
这就是问题:https://www.hackerrank.com/challenges/ctci-array-left-rotation
对 size 数组进行左旋转操作会将数组的每个元素单位向左移动。例如,如果对数组 执行左旋转,则该数组将变为 。
给定一个整数数组和一个数字 ,对数组执行左旋转。然后将更新后的数组打印为单行空格分隔的整数。
输入格式
第一行包含两个以空格分隔的整数,分别表示(整数的数量)和(必须执行的左旋转次数)的值。 第二行包含空格分隔的整数,描述数组初始状态的各个元素。
示例输入
5 4 1 2 3 4 5
示例输出
5 1 2 3 4
这是我的解决方案:
import Foundation
func shift(_ a: [String], n: Int, d: Int) -> String {
var s = a
for _ in 0 ..< d {
let v = s.remove(at: 0)
s.insert(v, at: n-1)
}
return s.joined(separator: " ")
}
let values = readLine()!.components(separatedBy: " ").map { Int($0)! }
let line2 = readLine()!.components(separatedBy: " ")
print(shift(line2, n: values[0], d: values[1]))
谁能帮我找到一个更干净的方法来解决这个问题?我的解决方案在最后两个测试用例之一上总是超时。
提前致谢。
最佳答案
不要根据所使用的数据结构删除/插入元素,这需要 O(n) 时间,而是在数组上进行交换。
func shift(_ a: [String], n: Int, d: Int) -> String {
var s = a
for i in 0 ..< d {
var t = s[0]
s[0] = a[(i - d)%n]
a[(i - d)%n] = t
}
return s.joined(separator: " ")
}
我没有运行这个,所以请确保代码是正确的,但想法是存在的。
关于ios - HackerRink 解决方案重构代码 (Swift),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41706621/