【发布时间】:2018-04-20 03:40:01
【问题描述】:
首先,有一点背景:
我正在研究the Codility lessons 之一,尽管这很容易解决,但从逻辑上讲,它并不容易解决,就性能而言。
我已经能够将其归结为:
public func solution(_ A : inout [Int]) -> Int {
let B = A // Assigning it to a local speeds it up.
return Array<Int>(Set(B)).sorted(by: {$0<$1}).reduce(0) { ($1 == $0 + 1) ? $1 : $0 } + 1
}
但是,这只是 WEE 有点太慢了。我想主要原因是 reduce 会遍历数组的所有元素,即使答案可能很早。我可能无法加快速度。
但我想试试。我正在看的部分是这样的:
.reduce(0) { ($1 == $0 + 1) ? $1 : $0 }
我想知道我是否可以使这种比较更有效。
我必须检查 $1 是否等于 $0 + 1。我无法避免这种比较。
三元运算符实际上并不比 if 子句快,但它看起来更酷;)。
有没有比基本的“==”运算符性能更高的方法来比较两个正整数的等价性?
顺便说一句:这不是“为我做作业”的问题。这是相当合法的,这些 Codility 课程不会给你任何荣誉或任何东西。他们只是一个有趣的练习。我想知道如何做到这一点,因为我确信我将来会需要它。
【问题讨论】:
-
也许我误读了这个问题,但您不能将数组中的所有数字相加,然后从 1 到 n + 1 的总和中减去它以获得缺失的数字吗?
-
嗯...我会试试的。我喜欢 Codility 的原因之一是他们有一些非常偷偷摸摸的单元测试。它可能会打破他们奇怪的极端案例之一。
-
你不能使用 A.sorted(by..... - Codility 说你应该假设列表是不同的。所以没有理由首先创建一个集合。
-
@LittleGreenViper 试试看,如果它失败了,请告诉我,我很好奇
-
问题不在于比较太慢,而是您使用了错误的算法,特别是对数字进行排序使其变慢。 – 这是一个众所周知的编程任务,只需 google “查找丢失的数字”,例如这里:geeksforgeeks.org/find-the-missing-number。
标签: arrays swift compare reduce