Swift#1中的Euler项目

我之前曾接受过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)