我之前曾接受过Google的采访,但失败了。 面试官指出了我的缺点,算法和对OS级别的深刻理解。 我相信许多开发人员可能会想为什么我们应该学习这些东西。 我们在日常工作中几乎不能使用它们。 但是,我从另一个角度考虑。 在我的工具集中拥有这些技能会很好。 他们可以帮助我思考解决方案并解决难题。 所以从现在开始,我有一些业余时间来学习新事物。 我决定在Euler项目上玩算法难题。
第一个问题称为3和5的倍数。
如果我们列出所有低于10的自然数,这些自然数是3或5的倍数,则得到3、5、6和9。这些倍数的总和为23。找到1000之下3或5的所有倍数的总和。
天真的解决方案是这样的:
让过滤=(1 .. <1000)。过滤器{ $ 0%3 == 0 || $ 0%5 == 0 } filter.reduce(0,组合:+)
我将其编写为两个表达式而不是一行,因为否则该表达式对于Xcode 7.3.1而言过于复杂。
但是该解决方案不可重用。 如果我们还有更多适用规则要怎么办? 例如,相反,我们想要3、5或7的倍数。
我试图编写一些帮助功能。 第一个函数是Int的扩展。 它检查一个整数是否可被另一个整数整除。
扩展Int { func divisibleBy(num:Int)-> Bool { 返回num%self == 0 } }
然后另一个函数检查给定的整数是否满足其中一个规则。 在这个问题中,规则是3的倍数和5的倍数。这将是Int-> Bool类型的函数。 我使它通用。
func满足条件(目标:T,规则:[T-> Bool])-> Bool { 对于规则中的规则{ 如果rule(target){ 返回真 } } 返回假 }
我们可以得到倍数的总和。
func sumOfMultiples(数字:[整数],可除数:[整数->布尔])->整数{ 返回数字。filter{满足条件One($ 0,规则:可分割)} .reduce(0,组合:+) }
sumOfMultiples(Array(1 .. <1000),divisibles:[3.divisibleBy,5.divisibleBy])
现在该代码是可重用的。 如果我们想要3、5或7的倍数,我们可以这样称呼:
sumOfMultiples(Array(1 .. <1000),divisibles:[3.divisibleBy,5.divisibleBy,7.divisibleBy])
现在您可能会问:“您说这是算法难题。 算法或难题在哪里?”。
3或5的倍数之和= 3的倍数之和+ 5的倍数之和— 15的倍数之和
func sumOfMultiples(max:Int,除数:Int)-> Int { 令n =最大值/除数 返回n *(n + 1)/ 2 *除数 } func sumOfMultiples(max:Int,divisor1:Int,divisor2:Int)-> Int { 返回sumOfMultiples(max,除数:divisor1) + sumOfMultiples(max,除数:divisor2) — sumOfMultiples(max,除数:divisor1 * divisor2) } sumOfMultiples(999,除数1:3,除数2:5)
但是,如果我们想应用更多规则,它将变得更加复杂并且很难编写通用解决方案。
对于3、5或7的倍数,它将是:
设最大= 999 sumOfMultiples(max,除数:3)+ sumOfMultiples(max,除数:5)+ sumOfMultiples(max,除数:7)— sumOfMultiples(max,除数:15)— sumOfMultiples(max,除数:21)— sumOfMultiples(max,除数) :35)+ sumOfMultiples(max,除数:105)