问题:给定一个正整数,如果它有正整数平方根,则求出它的平方根;如果它没有正整数平方根,则求出最接近的正整数平方根。不能使用sqrt(_: )
函数。
比如说,5、6、7、8都是没有正整数平方根的,但是最接近它的正整数平方根是2,而9的正整数平方根是3。现在要求写一个函数,能够计算出给定正整数的正整数平方根,或者最接近它的正整数平方根。
这个问题的解决方案有好几种,我们先来给一个性能比较差,并且有bug的解决方案:
// 性能不好,并且有bug
func challenge(input: Int) -> Int {
for i in 0 ... input / 2 {
if i * i > input {
return i - 1
}
}
return 0
}
challenge(input: 15) // 答案3
上面这段代码比较智障,因为它只能计算[6, +∞)之间的数据,而在计算[1, 5]之间的数据时,会有问题。并且,需要计算的数据越大,程序的性能就越差。所以,这个肯定不是最终的解决方案。
一个比较好的解决方案是使用二分查找法(Binary Search),既能完美解决bug,又极大的提高了计算性能。二分查找的思想是:先确定一个最低点x(往往从0开始),再确定一个最高点y(一般从N / 2 + 1开始),当x < y时,找到x和y的中间