【问题标题】:Refactor Code For HackerRink Solution (Swift)重构 HackerRink 解决方案的代码 (Swift)
【发布时间】:2017-06-02 01:49:35
【问题描述】:

我正在尝试解决一个非常简单的 HackerRank 测试,我有一些我认为非常干净和重构的代码......但它总是在最后一个测试用例中超时。我下载了它的输入,它是一个非常大的值字符串,但其他人使用更复杂的代码也能顺利通过。如果有的话,我需要一些帮助来找到一种更简洁的方式来表示我的解决方案。

这是问题所在:https://www.hackerrank.com/challenges/ctci-array-left-rotation

对大小数组的左旋转操作将数组的每个元素单元向左移动。例如,如果对 array 执行左旋转,则 array 将变为 .

给定一个整数数组和一个数字 ,对数组执行左旋转。然后将更新后的数组打印为一行以空格分隔的整数。

输入格式

第一行包含两个以空格分隔的整数,分别表示(整数个数)和(必须执行的左旋转数)的值。 第二行包含以空格分隔的整数,描述数组初始状态的各个元素。

示例输入

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]))

谁能帮我找到一个更干净的方法来解决这个问题?我的解决方案总是在最后两个测试用例之一上超时。

提前致谢。

【问题讨论】:

    标签: ios arrays swift string sorting


    【解决方案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: " ")
    }
    

    我没有运行这个,所以请确保代码是正确的,但想法是存在的。

    【讨论】:

    • 类似swap(&amp;s[0], &amp;s[n-1]) ?是这个意思吗?
    • 感谢您的帮助!我仍然一直在超时,但迈克尔上面类似的回答实际上让我通过了。我感谢大家的帮助。仍然得到我的支持
    【解决方案2】:

    您不需要进行交换,因为您已经创建了数组 (var s) 的副本,因此只需使用它即可。 IE。从源代码中取出并输出到 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: " ")
    }
    

    【讨论】:

    • 是的!这使得每个测试用例都能成功执行!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 2012-04-06
    相关资源
    最近更新 更多