HackerRink解决方案的重构代码(Swift)

时间:2017-01-17 20:43:34

标签: ios arrays swift string sorting

我试图解决一个非常简单的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]))

任何人都可以帮我找到更清洁的方法来解决这个问题吗?我的解决方案总是在最后两个测试用例之一上超时。

提前致谢。

2 个答案:

答案 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: " ")
}