这是悦乐书的第158次更新,第160篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69)。 计算并返回x的平方根,其中x保证为非负整数。 由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分。例如:

输入:4

输出:2

输入:8

输出:2

说明:8的平方根是2.82842 ...,从2以后小数部分被截断,返回2

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

使用二分法来算平方根。

特殊情况一:在求中间数时,需要考虑整型溢出的情况。因为在计算中间数时,习惯性很容易就写出mid = (right+left)/2,但是left+right的值如果溢出,那么整个计算都是失真的。此时,我们就需要做下替换,用减法替代加法:

right/2 + left/2

right/2 - left/2 + left

(right-left)/2 + left

特殊情况二:在判断中间数的平方是否等于传入的参数时,习惯性就写出 mid*mid == x,这其实也是存在溢出风险的,也可以变换下,做除法,即 x/mid == mid。

特殊情况三:传入的参数小于等于0的时候,直接返回0即可。

二分法来取平方根,低位取1,高位是x本身,如果低位小于等于高位,就进入循环求得两者中间数,做除法比较是否相等,相等则返回中间数,如果高位除以中间数大于中间数,则低位等于中间数向前加1,如果高位除以中间数小于中间数,则高位等于中间数向后减1。直到低位大于高位,结束循环,返回高位。

public int mySqrt(int x) {
if (x < 1)
return 0;
int low = 1;
int high = x;
while (low <= high) {
int mid = (high - low) / 2 + low;
if (x / mid == mid)
return mid;
if (x / mid > mid)
low = mid + 1;
if (x / mid < mid)
high = mid - 1;
}
return high;
}

03 第二种解法

直接使用Math自身的sqrt()方法,如果面试时遇到此题,还是以上面的解法或者下面的第三种为好。

public int mySqrt2(int x) {
return (int) Math.sqrt(x);
}

04 第三种解法

利用牛顿迭代法计算开平方根,在此不过多描述,会单独抽时间来写这个经典的求平方根解法。

public int mySqrt3(int x) {
double flag = 0.1d;
if (x <= 0) {
return 0;
}
double val = x;
double last;
do {
last = val;
val = (val + x / val) / 2;
} while (val - last > flag || val - last < -flag);
return (int) val;
}

05 测试用例和结果

对比上述三种解法,使用了一些数据做了测试,并记录了算法花费的时间。

public static void main(String[] args) {
Easy_069_Sqrt instance = new Easy_069_Sqrt();
int arg = 2;
long start = System.nanoTime();
int result = instance.mySqrt(arg);
long end = System.nanoTime();
System.out.println("mySqrt()---输入:" + arg + " , 输出:" + result + " , 用时:" + ((end - start) / 1000) + "微秒");
System.out.println("-----------------------------------------------");
long start2 = System.nanoTime();
int result2 = instance.mySqrt2(arg);
long end2 = System.nanoTime();
System.out.println("mySqrt2()---输入:" + arg + " , 输出:" + result2 + " , 用时:" + ((end2 - start2) / 1000) + "微秒");
System.out.println("-----------------------------------------------");
long start3 = System.nanoTime();
int result3 = instance.mySqrt3(arg);
long end3 = System.nanoTime();
System.out.println("mySqrt3()---输入:" + arg + " , 输出:" + result3 + " , 用时:" + ((end3 - start3) / 1000) + "微秒");
}

测试结果如下

mySqrt()---输入:3600 , 输出:60 , 用时:4微秒
-----------------------------------------------
mySqrt2()---输入:3600 , 输出:60 , 用时:20微秒
-----------------------------------------------
mySqrt3()---输入:3600 , 输出:60 , 用时:5微秒

06 小结

方法1和方法3运算速度还是较快的,Math类的sqrt方法与之对比还是稍逊一些。以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

LeetCode算法题-Sqrt(Java实现)的更多相关文章

  1. LeetCode算法题-Prime Number of Set Bits in Binary Representation(Java实现)

    这是悦乐书的第311次更新,第332篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第180题(顺位题号是762).给定两个正整数L和R,在[L,R]范围内,计算每个整数的 ...

  2. LeetCode算法题-Sum of Square Numbers(Java实现)

    这是悦乐书的第276次更新,第292篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第144题(顺位题号是633).给定一个非负整数c,判断是否存在两个整数a和b,使得a的 ...

  3. LeetCode算法题-Perfect Number(Java实现)

    这是悦乐书的第249次更新,第262篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第116题(顺位题号是507).我们定义Perfect Number是一个正整数,它等于 ...

  4. LeetCode算法题-Construct the Rectangle(Java实现)

    这是悦乐书的第243次更新,第256篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第110题(顺位题号是492).对于Web开发人员,了解如何设计网页的大小非常重要.因此 ...

  5. LeetCode算法题-Arranging Coins(Java实现)

    这是悦乐书的第229次更新,第241篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第96题(顺位题号是441).您想要以楼梯形状形成总共n个硬币,其中每个第k行必须具有恰 ...

  6. LeetCode算法题-Valid Perfect Square(Java实现-四种解法)

    这是悦乐书的第209次更新,第221篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第77题(顺位题号是367).给定正整数num,写一个函数,如果num是一个完美的正方形 ...

  7. LeetCode算法题-Subdomain Visit Count(Java实现)

    这是悦乐书的第320次更新,第341篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第189题(顺位题号是811).像"discuss.leetcode.com& ...

  8. LeetCode算法题-Number of Lines To Write String(Java实现)

    这是悦乐书的第319次更新,第340篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第188题(顺位题号是806).我们要将给定字符串S的字母从左到右写成行.每行最大宽度为 ...

  9. LeetCode算法题-Unique Morse Code Words(Java实现)

    这是悦乐书的第318次更新,第339篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第186题(顺位题号是804).国际莫尔斯电码定义了一种标准编码,其中每个字母映射到一系 ...

随机推荐

  1. 南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题

    问题 A: 割点与桥 时间限制: 1 Sec  内存限制: 5 MB提交: 475  解决: 34提交 状态 算法问答 题目描述 给出一个无向连通图,找到所有的割点和桥 输入 第一行:点的个数,如果点 ...

  2. 了解golang的可变参数(... parameters),这一篇就够了

    在实际开发中,总有一些函数的参数个数是在编码过程中无法确定的,比如我们最常用的fmt.Printf和fmt.Println: fmt.Printf("一共有%v行%v列\n", r ...

  3. Font Awesome 供更精准的图标搜索

    https://www.thinkcmf.com/font/font_awesome/icon/address-book

  4. 爬虫应对js混淆的方法

    大家做爬虫可能经常要跟js打交道.如果积累一定的经验肯定会遇到eval(....);这种js,很多新人可能慌了,woc这怎么办??????? 下面楼主给大家介绍一种方法简单,有效. F12 在Cons ...

  5. springboot用户登陆密码两次md5加密

    1.用户端:PASS = MD5(明文 + 固定salt) 2.服务端:PASS = MD5(用户输入 + 随机salt) 引入依赖包 <dependency> <groupId&g ...

  6. python进程基础

    目录 进程以及状态 1. 进程 2. 进程的状态 进程的创建-multiprocessing 1. 创建进程 2. 进程pid 3. Process语法结构如下 4. 给子进程指定的函数传递参数 5. ...

  7. python面向对象学习(一)基本概念

    目录 1. 面向对象基本概念 1.1 过程和函数 1.2 面相过程 和 面相对象 基本概念 2. 类和对象的概念 1.1 类 1.3 对象 3. 类和对象的关系 4. 类的设计 大驼峰命名法 4.1 ...

  8. C#设计模式之八装饰模式(Decorator Pattern)【结构型】

    一.引言 今天我们要讲[结构型]设计模式的第三个模式,该模式是[装饰模式],英文名称:Decorator Pattern.我第一次看到这个名称想到的是另外一个词语“装修”,我就说说我对“装修”的理解吧 ...

  9. Javascript继承4:洁净的继承者----原型式继承

    //原型式继承 function inheritObj(obj){ //声明一个过渡函数对象 function F(){} //过渡对象的原型继承父对象 F.prototype = obj; //返回 ...

  10. 6.方法_EJ

    第38条: 检查参数的有效性 对于这一条,最常见的莫过于检查参数是否为null. 有时出现调用方未检查传入的参数是否为空,同时被调用方也没有检查参数是否为空,结果这就导致两边都没检查以至于出现null ...