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

标签 ios arrays swift string sorting

我正在尝试解决一个非常简单的 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/

相关文章:

ios - UIAlertController 内存泄漏/问题 - Swift

ios - UIView Gradient 使用 CAGradientLayer 总是蓝色

c# - 标准偏差计算在 C# 中不起作用?

javascript - 如何计算数字和数学运算符的数组(或字符串)

ios - 快速向按钮添加手势

swift - 如果存在管道,通过 NSTask 的 cURL 不会终止

ios - 无法在 Swift2.0 中调用类型 'NSDictionary' 的初始值设定项

ios - CocoaPods iOS 框架链接 i386 文件

arrays - Swift - 混洗过滤后的结构数组不会改变原始数组

javascript - 过滤和映射后如何获取用户ID