LeetCode算法题-Sqrt(Java实现)

Java中开根号,你还记得吗? 开根号相信大家都不陌生,这是一种数学运算,也称为开方运算,运算符号是根号 √ ̄。那么在 Java 中如何实现开方运算呢? 阅读详情

这是悦乐书的第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方法与之对比还是稍逊一些。以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

面向对象计算器命令行参数传入 java采用面向对象编程方法实现一个简单的计算器,完成两个整数的加、减、乘、除运算。参与运算的两个整数及运算符从命令行参数传入。.txt 立即下载

相关推荐

不止于ACC:用CarSim的‘Multiple Objects’和路径跟踪器玩转复杂交通流场景

本文深入探讨了如何利用CarSim的'Multiple Objects'模块和路径跟踪器模拟复杂交通流场景,超越传统ACC测试的局限。通过批量控制、动态交互和参数化设计,实现多车智能响应和复杂轨迹模拟,适用于连续变道、拥堵博弈、匝道汇流等真实交通场景。

weixin_30954265的博客 497

Sqrt(int x) leetcode java

Reference: http://blog.youkuaiyun.com/lbyxiafei/article/details/9375735 题目:Implement int sqrt(int x). Compute and return the square root of x. 题解: 这道题很巧妙的运用了二分查找法的特性,有序,查找pos(在这道题中pos=value),找到返回pos,找不到...

weixin_33670786的博客 252

深度学习初探 - 入门 DL 主流框架

这个课程主要是引导大家入门TensorFlow、Theano、Keras 及 Caffe 几个主流的深度学习框架。在课程中有关各种算法的详细推导及思想我们不会做过多的陈诉,旨在通过让同学们动手操作搭建自己的神经网络模型,了解如何使用这些框架解决实际问题。课程会基于每个框架的官方文档,先带大家熟悉框架中基本的定义语法及常用函数(可看成深度模型的小零件),每个实验最后都会综合这些零件搭建一个简易的神经深度网络模型。这个项目十分适合具有一定python编程基础,对人工智能、深度学习感兴趣的同学。Theano。

2401_86435672的博客 1236

Java中开根号,你还记得吗?_java sqrt

根号运算是一种数学运算,也称为开方运算。它的运算符号是 ,被称为根号符号,要将被开方的数包围。若 ,那么 是 开 次方的 次方根或 是 的 次方。开 次方的 写在符号 的左边,(平方根)时 可以忽略不写x\sqrt{x}x​,但若是立方根(三次方根)x3\sqrt[3]{x}3x​、四次方根x4\sqrt[4]{x}4x​ 等,是必须书写。我们比较常见的也就是求一个数的平方根了,对于一个非负实数 ,它的平方根 是一个非负实数,使得 的平方等于 ,即 。例如,4\sqrt{4}4​=

2301_82257730的博客 1865

2024年五大革新图像分割模型解析:架构创新与实战应用指南

本文深入解析2024年五大革新图像分割模型,包括SAM2、Mask2Former、DINOv2和Swin Transformer等,探讨其架构创新与实战应用。从多尺度处理、提示交互到自监督学习,这些模型在精度提升、效率优化和交互增强方面取得突破,广泛应用于医疗影像、工业质检和智慧城市等领域。

hadoop5ranger的博客 895

PADS导出PCB正反面丝印为CAD文件的方法

本文介绍如何将PADS绘制的pcb格式的PCB文件顶底层丝印及板框导出为CAD的dxf文件格式,并且将底层丝印进行镜像为正常视角

luguodeyo的博客 3299

sqrt在java中_LeetCode算法题-Sqrt(Java实现)

这是悦乐书的第158次更新,第160篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69)。 计算并返回x的平方根,其中x保证为非负整数。 由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分。例如:输入:4输出:2输入:8输出:2说明:8的平方根是2.82842 ...,从2以后小数部分被截断,返回2本次解题使用的开发工具是eclipse,...

weixin_29956903的博客 559

【Dify】36氪新闻热榜智能自动化采集与AI处理

本文介绍如何利用Dify等自动化工具实现36氪新闻热榜的智能采集与处理。通过HTTP请求节点获取数据,JSON解析节点结构化处理,AI处理节点生成智能摘要,最终格式化输出结果。工作流程包含数据获取、解析、AI摘要、文本整理和内容输出五个环节,支持批量化、定制化的新闻处理需求。该方案适用于行业监测、内容创作、舆情管理等场景,显著提升信息获取效率,实现"所需即得"的自动化新闻服务。系统采用OpenAI GPT和Dify API作为核心模型,无需复杂人工干预即可完成全流程处理。

Mr数据杨 604

在java中sqrt的用法_Java sqrt()用法及代码示例

java.lang.Math.sqrt()返回作为参数传递给它的double类型值的平方根。如果参数为NaN或负数,则结果为NaN。如果参数为正无穷大,则结果为正无穷大。如果传递的参数为正零或负零,则结果将与参数相同。用法:public static double sqrt(double a)Parameter:a:the value whose square root is to be retu...

weixin_30536861的博客 7157

【AUTOSAR-Nm】-2.2-通过CAN/Lin...信号报告Nm状态机的跳转

如何通过Can/Lin/Fr/Udp/J1939信号,获取每个通道对应状态机的跳转信息:“前一次状态”和“当前状态”。

「汽车电子助手」的博客 2467

Kafka 入门篇(一)

初识 Kafka 什么是 Kafka Kafka 的基本术语 Kafka 的特性(设计原则) Kafka 的使用场景 Kafka 的消息队列 点对点模式的消息队列 发布-订阅模式的消息队列 Kafka 系统架构 核心 API Kafka 为何如此之快 broker 端配置 broker.id port zookeeper.connect log.dirs num.recovery.threads.per.data.dir auto.create.topics.enable topic默认配置 num.par

1240

java sqrt 方法实现_LeetCode算法题-Sqrt(Java实现)

这是悦乐书的第158次更新,第160篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第17题(顺位题号是69)。 计算并返回x的平方根,其中x保证为非负整数。 由于返回类型是整数,因此将截断十进制数字,并仅返回结果的整数部分。例如:输入:4输出:2输入:8输出:2说明:8的平方根是2.82842 ...,从2以后小数部分被截断,返回2本次解题使用的开发工具是eclipse,...

weixin_39911475的博客 460

【Proteus仿真】基于AT89C51单片机的单片机双向通信

本文介绍了基于AT89C51单片机实现双向通信的系统设计。系统采用MAX232芯片实现TTL与RS-232电平转换,通过CONN-D9F接口建立串行通信连接。甲机程序通过按键控制发送不同指令字符,同时接收乙机数据驱动数码管显示;乙机程序根据接收指令控制LED显示状态,并可发送0-10数字至甲机。文中详细说明了MAX232电平转换原理、DB9接口定义,以及完整的单片机控制程序代码,包括串口初始化、数据收发处理等关键功能实现,为嵌入式系统串口通信开发提供了实用参考方案。

XU157303764的博客 1096

LeetCode69. Sqrt(x)

69.Sqrt(x) 题意: 实现 int sqrt(int x), 返回根号下x。 Implement int sqrt(int x). Compute and return the square root of x.我的思路: 用折半查找的方法。public int mySqrt(int x) { int first = 1; int last = x; int

YTTmiao的博客 284

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LeetCode 69 — Sqrt(x)(C++ Java Python)

题目:http://oj.leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute and return the square root of x. 题目翻译: 实现int sqrt(int x)。 计算并返回x的平方根。 分析:         二分查找。注意结果不是整数时应返回整数部分。 C++实现:

龙之梦 4138

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

力扣-69. Sqrt(x)-CPP

本文介绍了解决开平方根问题时的三种常见思路,顺带阐述了其思考过程,逻辑难点。其实初学者掌握最基本的解题思路即可,反复遇见此题后,便会有更多思考。

喜爱设计架构,追求项目可控。 990

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode 69. Sqrt(x) 解题报告

LeetCode 69. Sqrt(x) 解题报告题目描述Implement int sqrt(int x).Compute and return the square root of x.示例没有给出。限制条件没有明确给出。解题思路这道题很虐心,我首先用的是牛顿迭代法解题,但是一直在2147395600和214739599这两个数出问题,于是改成用二分法,然而,还是载在这两个数据上,通过艰苦卓绝地

骆小坑的填坑之旅 702

Sqrt x -- LeetCode

Sqrt x -- LeetCode

weixin_43418664的博客 194

LeetCode——Sqrt(x)

Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a non-negative integer. Since the return type is an integer, the decimal digits are truncated and only t...

sinat_22994595的博客 218

leetcode 69. 实现Sqrt(x)

https://leetcode.com/problems/sqrtx/ 计算并返回一个整数x的平方根,x保证是非负整数 一、题目分析 题目给了两个测试用例 Input: 4 Output: 2 Input: 8 Output: 2 Explanation: The square root of 8 is 2.82842..., and since t...

小景的博客 262

leetcode第69题Sqrt(x).java – day01

leetcode第69题Sqrt(x).java – day01 给你一个非负整数 x ,计算并返回 x 的 算术平方根 。 由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。 注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1: 输入:x = 4 输出:2 示例 2: 输入:x = 8 输出:2 解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。 提示: 0 <= x <= 231 - 1

m0_47550310的博客 6915

SQRT分解

SQRT分解,docker

sdfsdfsdds2的博客 375

LeetCode Sqrt(x) 整数平方根 java

http://oj.leetcode.com/problems/sqrtx/ 求一个整数的平方根,如果该整数的平方根不是整数的话,返回平方根取整。 最简单办法,暴力搜索从1到N/2搜索但会TLE。 二分搜索,开始区间是1,终止区间是x。 AC代码: [java] view plain copy   public cl

samjustin的博客 2984

LeetCode Sqrt(x)

原题链接在这里:https://leetcode.com/problems/sqrtx/ 题目: Implementint sqrt(int x). Compute and return the square root ofx. 题解: 与Pow(x, n)类似。 此类查找可以用 Binary Search, 先找middle = (left + right)/2, middle^...

weixin_30588907的博客 149

算法:Sqrt(x) (x 的平方根)

说明 算法:Sqrt(x) LeetCode地址:https://leetcode.com/problems/sqrtx/ 题目: Implement int sqrt(int x). Compute and return the square root of x, where x is guaranteed to be a non-negative integer. Since the retu...

AI架构师易筋 2530
上一篇: LeetCode算法题-Add Binary(Java实现)
下一篇: LeetCode算法题-Climbing Stairs(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值