我试图解决一个非常简单的HackerRank测试,我有一些代码,我认为它非常干净和重构......但它总是在最后一个测试用例上超时。我为它下载了输入,它是一个非常大的值字符串,但其他人通过更复杂的代码传递得很好。如果有的话,我想帮助找到一种更清晰的方式来表示我的解决方案。
这就是问题所在:https://www.hackerrank.com/challenges/ctci-array-left-rotation
对大小数组的左旋转操作将每个阵列元素单元向左移动。例如,如果在数组上执行左旋转,则数组将变为。
给定一个整数数组和一个数字,在数组上执行左旋转。然后将更新的数组打印为一行以空格分隔的整数。
输入格式
第一行包含两个以空格分隔的整数,表示(整数个数)和(必须执行的左旋转数)的相应值。 第二行包含空格分隔的整数,用于描述数组初始状态的各个元素。
示例输入
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]))
任何人都可以帮我找到更清洁的方法来解决这个问题吗?我的解决方案总是在最后两个测试用例之一上超时。
提前致谢。
答案 0 :(得分:2)
取代根据所使用的数据结构删除/插入应采用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: " ")
}
我没有运行这个,所以要确保代码是正确的,但这个想法就在那里。
答案 1 :(得分:1)
您不需要进行交换,因为您已经创建了数组副本(var s),所以只需使用它。即从源和输出中获取s,简单明了的例子:
func shift(_ a: [String], n: Int, d: Int) -> String {
var s = a
for i in 0 ..< n {
s[i] = a[(i + d)%n]
}
return s.joined(separator: " ")
}