69. x 的平方根

非常简单的一个题,用二分法逼近求出ans即可,额外注意下溢出问题。

不过我要给自己增加难度,用long或者BigNum实现没意思,只能使用int类型

换句话当出现溢出时我们自己得检测出来

原代码(会溢出)

class Solution {
public int mySqrt(int x) {
int l = 1;
int r = x;
while (l < r) {
int mid = (l + r) / 2;// l+r会溢出
if (mid * mid == x) { // 乘法会溢出
return mid;
} else if (mid * mid < x) {
l = mid + 1;
} else {
r = mid;
}
}
if (l * l > x) l--;
return l;
}
}

两处会出现溢出,我们换种不溢出的方法实现即可了

优化代码

class Solution {
public int mySqrt(int x) {
int l = 1;
int r = x;
while (l < r) {
int mid = l / 2 + r / 2;
if (l % 2 == 1 && r % 2 == 1) {
mid++;//当两个数都是奇数时,mid需要+1
}
if (fun(mid, x) == 0) {
return mid;
} else if (fun(mid, x) < 0) {
l = mid + 1;
} else {
r = mid;
}
}
if (fun(l, x) > 0) l--;
return l;
} // 不溢出的判断 mid^2 与x的大小
int fun(int mid, int x) {
int tmp = 0;
if (mid < 10000) {
tmp = mid * mid;//当小于10000时,直接相乘就好了
} else {
// 采用累加的形式,一旦出现负数就说明溢出了
for (int i = 0; i < mid; i++) {
tmp += mid;
if (tmp <= 0) {
return 1;
}
}
}
if (tmp > x) return 1;
if (tmp == x) return 0;
return -1;
}
}

另外一种判断方法:

 // 判断 mid^2 与x的大小
int fun(int mid, int x) {
int tmp = mid * mid;
if (tmp / mid != mid) {
// 出现溢出,mid^2大
return 1;
}
if (tmp == x) return 0;
if (tmp > x) return 1;
return -1;
}

[leetcode] 69. x 的平方根(纯int溢出判断实现)的更多相关文章

  1. Java实现 LeetCode 69 x的平方根

    69. x 的平方根 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: ...

  2. LeetCode 69 x 的平方根

    链接:https://leetcode-cn.com/problems/sqrtx 实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数, ...

  3. 字节笔试题 leetcode 69. x 的平方根

    更多精彩文章请关注公众号:TanLiuYi00 题目 解题思路 题目要求非负整数 x 的平方根,相当于求函数 y = √x 中 y 的值. 函数 y = √x  图像如下: 从上图中,可以看出函数是单 ...

  4. [LeetCode]69. x 的平方根(数学,二分)

    题目 https://leetcode-cn.com/problems/sqrtx 题解 方法一:牛顿迭代法 按点斜式求出直线方程(即过点Xn,f(Xn)),然后求出直线与x轴交点,即为Xn+1: 求 ...

  5. Leetcode 69. Sqrt(x)及其扩展(有/无精度、二分法、牛顿法)详解

    Leetcode 69. Sqrt(x) Easy https://leetcode.com/problems/sqrtx/ Implement int sqrt(int x). Compute an ...

  6. SQL语句中 int 溢出 + Asp语句中 Long 溢出

    晚上5点多,同事在QQ告诉我,一个用户向他反应,在他登录的时候显示错误信息,我们在管理平台查看该用户的基本信息时,也显示错误信息. 经过初步分析,原来是在执行 SQL语句的时候发生Int溢出: sql ...

  7. leetcode-零钱兑换—int溢出

     零钱兑换 给定不同面额的硬币 coins 和一个总金额 amount.编写一个函数来计算可以凑成总金额所需的最少的硬币个数.如果没有任何一种硬币组合能组成总金额,返回 -1. 示例 1: 输入: c ...

  8. 69.x的平方根 (平)(简单)

    实现 int sqrt(int x) 函数. 计算并返回 x 的平方根,其中 x 是非负整数. 由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去. 示例 1: 输入: 4输出: 2示例 2: ...

  9. Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence)

    Leetcode之动态规划(DP)专题-392. 判断子序列(Is Subsequence) 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母. ...

随机推荐

  1. Day13_69_yield()

    yield() 方法 - Thread.yield() 该方法是一个静态方法, 作用是给同一个优先级的线程让位,阻塞当前线程,但是阻塞时间不可以指定,是随机的. - Thread.yield() 和 ...

  2. prometheus+grafana监控mysql最佳实践

    导航 前言 环境准备 安装Docker 安装prometheus 安装mysqld_exporter prometheus采集数据 安装grafana grafana配置数据源 感谢您的阅读,预计阅读 ...

  3. 路由器逆向分析------Running Debian MIPS Linux in QEMU

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/70176583 下面的文章内容主要参考英文博客<Running Debian ...

  4. Xposed学习二:实现机制

    在上一篇我们学习了如何在AS中创建Xposed模块,本篇来分析下官方教程中redClock的实现原理.本系列文章基于version-51 public void handleLoadPackage(X ...

  5. UVA11722(见面概率)

    题意:       有一个车站,两个人想要在这个车站见面,第一个人会在t1到t2之间的任意一个时刻到(时间上任意一点概率一样),并且停留w时间,第二个人是s2到s2的时间段到,停留也是w,问两个人的见 ...

  6. Windows PE第九章 线程局部存储

    线程局部存储(TLS) 这个东西并不陌生了,之前写过了一个关于这个的应用,利用静态TLS姿势实现代码段静态加密免杀或者所谓的加壳思路.地址在这:http://blog.csdn.net/u013761 ...

  7. 基于 RTF specification v1.7 的 RTF 文件解析及 OLE 对象提取(使用 Python 开发)

    0x01 Office RTF 文件介绍 RTF 文件也称富文本格式(Rich Text Format, 一般简称为 RTF),意为多文本格式是由微软公司开发的跨平台文档格式.大多数的文字处理软件都能 ...

  8. PowerShell-6.文件操作

    1.显示文本内容 Get-Content "°C:\\Program Files (x86)\\PsUpdate\\b.dat" 2.得到b.dat文件内容,然后把里面的所有'C' ...

  9. WindowsPE 第五章 导出表

    导出表 PE中的导出表存在于动态链接库文件里.导出表的主要作用是将PE中存在的函数导出到外部,以便其他人可以使用这些函数,实现代码重用. 5.1导出表的作用 代码重用机制提供了重用代码的动态链接库,它 ...

  10. 分解uber依赖注入库dig-源码分析

    上一篇帖子 分解uber依赖注入库dig-使用篇 把如何使用dig进行代码示例说明,这篇帖子分析dig的源码,看他是如何实现依赖注入的. dig实现的中心思想:所有传入Provide的函数必须要有除e ...