面试高频算法题:求平方根,精确到小数点后n位(Java)

前几天面美团的时候被问到了这个问题,自己处理的不是很好,在此重新总结一下。

面试题目要求:求某正整数的平方根,要求误差小于0.01

//二分法进行处理,注意变量类型
 public static double sqrt(int target){
        double n=1e-2;            //在这里可根据精度要求进行调整
        double l=0,r=target;      //这里若初始化r=target/2的话,则处理较小正整数会出错,如1,2
        while(l<=r){              //二分查找
            double mid=(l+r)/2;
            //这里用除法,而不用mid*mid与target比较,是防止mid过大时,mid*mid产生溢出问题
            if(target/mid<mid){   
                r=mid-n;
            }else{
                l=mid+n;
            }
        }
        return r;
    }

验证代码是否正确运行

public class Main {
    public static void main(String[] args) {
       //定义一个8个整数的数组来验证,数组有包括小正整数和较大的正整数
       int[] arr={1,2,6,9,18,65,102,266665898};   
        for(int i=0;i<arr.length;i++) {
            boolean res = Math.abs(sqrt(arr[i])-Math.sqrt(arr[i]))<0.01;
            System.out.println("差距是否小于0.01:   "+ res);                                           //达到精度要求则输出true
        }
    }
    public static double sqrt(int target){
        double n=1e-2;
        double l=0,r=target/2;
        while(l<=r){
            double mid=(l+r)/2;
            if(target/mid<mid){
                r=mid-n;
            }else{
                l=mid+n;
            }
        }
        return r;
    }
}

运行结果

在这里插入图片描述

tips

这题也可以用牛顿迭代法来处理,且代码更加简洁。但一些大厂在面试时会告知面试者不能使用牛顿迭代法。所以还是建议采用二分法。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值