美团面试手撕:手动实现开方函数math.sqrt(x)
题目
手动实现math.sqrt(x),保留两位小数,不允许调库实现
解答
这个代码实现了一个手动计算平方根的函数,使用二分查找法来逼近平方根的值。主要思路如下:
(1)特殊情况处理:
如果输入x是负数,抛出异常(负数没有实数平方根)
如果x是0或1,直接返回x(因为√0=0,√1=1)
(2)确定查找区间:
对于小于1的正数,平方根会大于x本身但小于1,所以二分查找区间设为[x, 1]
对于大于1的数,平方根会在0和x之间,所以二分查找区间设为[0, x]
(3)二分查找过程:
不断将区间二分,直到区间长度小于0.01(达到指定精度)
每次计算中点的平方值:
如果中点平方小于x,说明平方根在中点右侧,将下限low调整为中点
否则,说明平方根在中点左侧,将上限high调整为中点
(4)返回结果:当区间足够小时,返回区间的中点作为平方根的近似值
算法特点:
使用二分查找法,时间复杂度为O(log n)
对于不同范围的输入值(x<1和x≥1)采用不同的初始区间,提高效率
通过调整循环条件中的精度值(0.01)可以控制结果的精确度
def handle_sqrt(x):if x < 0:raise ValueError("负数没有平方根")if x == 0 or x == 1:return xif x < 1:low, high = x, 1else:low, high = 0, xwhile high - low > 0.01:mid = (low+high)/2mid_squared = mid ** 2if mid_squared < x:low = midelse:high = mid return (low+high)/2 print(handle_sqrt(3)) # 1.7314453125