当前位置: 首页 > 知识库问答 >
问题:

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

夏飞跃
2023-03-14

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

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

先谢谢你。

共有2个答案

戈博易
2023-03-14

您不需要进行交换,因为您已经在创建数组(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: " ")
}
危璞
2023-03-14

根据使用的数据结构,删除/插入应该采用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: " ")
}

我没有运行这个,所以要确保代码是正确的,但这个想法就在那里。

 类似资料:
  • 我在一本书中发现了一个“用餐哲学家问题”的替代解决方案,用Java编写: 解决方案的文本是: 或者,我们可以给筷子贴上从e到N-1的标签。每个哲学家都试图先拿起编号较低的筷子。这基本上意味着每个哲学家都会先选择左边的筷子,再选择右边的筷子(假设你是这样给它贴标签的),除了最后一位哲学家会选择相反的方式。有了这个解决方案,哲学家不可能拿着大筷子而不拿着小筷子。这就阻止了循环的能力,因为循环意味着较高

  • Hyperledger Composer使架构师和开发人员能够快速创建“全堆栈”区块链解决方案。即业务逻辑运行在区块链上运行,REST API将区块链逻辑暴露给Web或移动应用程序,以及将区块链与现有企业记录系统集成在一起。 Hyperledger Composer由以下高级组件组成: 执行运行时(目前支持四个!) JavaScript SDK 命令行接口 REST服务器 LoopBack连接器

  • 一面,已挂,持续时间1个半小时 1.项目,科研项目,做的java项目 3.问了一些计网 2.java基础,主要问了类的加载过程和GC 3.测试相关问题,白盒、黑盒、以及一些具体的 4.设计测试用例题 5.一道贪心,没写出来 自己还是太菜了,之前的Java笔试做不起,被hr捞起来去投解决方案测试,面试依旧没手撕出来。 #华为##解决方案测试工程师#

  • 我正在尝试解决类似于员工名册的问题。我面临的问题是,每次我运行求解器时,它都会生成不同的任务。这使得更难调试为什么选择特定案例而不是另一个案例。为什么会这样? 附注:我的任务有许多硬性限制,可能无法全部满足(大多数情况下,我仍然看到一些负面的硬性评分)。所以我的终止策略是基于< code > unimprovedSecondsSpentLimit 。会不会是这个原因?

  • 我尽最大努力解决leetcode中的二和问题 给定一个整数数组,返回两个数字的索引,使它们相加到一个特定的目标。 您可以假设每个输入都有一个精确的解决方案,并且您可以不使用相同的元素两次。 例子: 该计划: 1) 强力迭代len(nums)O(n) 2)使用哈希表O(1)搜索target-num[i] 使生效 我为这个解决方案努力了几个小时,但发现答案被接受了,但没有通过60分。 运行时间:60毫

  • 1px 方案在 VUX 组件内应用广泛,包括 Grid, ButtonTab, XTable, XButton, Cell 等等。 利用 Flexbox + 1px 你可以实现复杂的宫格布局。 引入 在你项目的App.vue引入,组件内不需要再重复引入。 <style lang="less"> @import '~vux/src/styles/1px.less'; </style> 可用类名: