【golang】leetcode中级-x的平方根&两数相除&分数到小数

逻辑漫游
• 阅读 904

第一题 x的平方根

题目

【golang】leetcode中级-x的平方根&两数相除&分数到小数

二分查找

对于算术平方根的计算,我们可以使用二分查找不断缩小边界,最终找到其算术平方根

具体代码

func mySqrt(x int) int {
    l, r := 0, x
    ans := -1
    for l <= r {
        mid :=  (r + l) / 2
        if mid * mid <= x {
            ans = mid
            l = mid + 1
        } else {
            r = mid - 1
        }
    }
    return ans
}

效果如下

【golang】leetcode中级-x的平方根&两数相除&分数到小数

牛顿迭代法

【golang】leetcode中级-x的平方根&两数相除&分数到小数

【golang】leetcode中级-x的平方根&两数相除&分数到小数

代码

func mySqrt(x int) int {
    if x == 0 {
        return 0
    }
    C, x0 := float64(x), float64(x)
    for {
        xi := 0.5 * (x0 + C/x0)
        if math.Abs(x0 - xi) < 1e-7 {
            break
        }
        x0 = xi
    }
    return int(x0)
}

复杂度分析

时间复杂度:O(logx)。

空间复杂度:O(1)。

第二题 两数相除

题目

【golang】leetcode中级-x的平方根&两数相除&分数到小数

思路

官解的思路较为复杂

仅供参考

【golang】leetcode中级-x的平方根&两数相除&分数到小数

对于除法
可以用更朴素的减法思维来计算
借鉴快速幂和快速乘的思想
我们从2的n次幂找起
每次找到刚好比被除数小的除数*2^n
并在结果中加入2^n

代码如下

func divide(dividend int, divisor int) int{
    if dividend == math.MinInt32 { // 考虑被除数为最小值的情况
        if divisor == 1 {
            return math.MinInt32
        }
        if divisor == -1 {
            return math.MaxInt32
        }
    }
    if divisor == math.MinInt32 { // 考虑除数为最小值的情况
        if dividend == math.MinInt32 {
            return 1
        }
        return 0
    }
    if dividend == 0 { // 考虑被除数为 0 的情况
        return 0
    }
    a := dividend
    b := divisor
    sign := 1
    if (a>0&&b<0) || (a<0&&b>0) {
        sign = -1
    }
    if a<0 {a=-a}
    if b<0 {b=-b}
    res := div(a,b)
    if sign>0{return res}else{
        return -res
    }
}
func div( a int,  b int)int {
    if a < b {
        return 0
    }
    count :=1

    tb := b // 在后面的代码中不更新b
    for (tb + tb) <= a {
        count = count + count // 最小解翻倍
        tb = tb + tb         // 当前测试的值也翻倍
    }
    return count + div(a-tb, b)
}

溢出处理可以参考官解

用减法完成除法的思想详细可以了解组成原理中定点数的除法运算

复杂度分析

时间复杂度:O(logn)。其中n为商的大小

空间复杂度:O(logn)。div中递归调用栈的最大深度为logn

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Souleigh ✨ Souleigh ✨
5年前
python实现——最优化算法(二分法、格点法、黄金分割法、牛顿法等)
二分法函数详见rres,此代码使该算法运行了两次pythondefasdf(x):rres8x32x27x3returnrresi2left0right1whilei0:ii1ans0.1mid1(leftrightans)/2
Stella981 Stella981
4年前
MacOS VSCode 安装 GO 插件失败问题解决
0x00问题重现Installinggolang.org/x/tools/cmd/guruFAILEDInstallinggolang.org/x/tools/cmd/gorenameFAILEDInstallinggolang.org/x/lint/golintFAILEDInst
Wesley13 Wesley13
4年前
mysql中的round函数
在mysql中,round函数用于数据的四舍五入,它有两种形式:1、round(x,d) ,x指要处理的数,d是指保留几位小数这里有个值得注意的地方是,d可以是负数,这时是指定小数点左边的d位整数位为0,同时小数位均为0;2、round(x) ,其实就是round(x,0),也就是默认d为0;下面是几个实例1、查询: selectr
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
MySQL中的数值函数
常用数值函数函  数功  能ABS(x)返回数值x的绝对值CEIL(x)返回大于或等于x的最小整数值FLOOR(x)返回小于或等于x的最大整数值MOD(x,y)返回x除以y的余数RAND()返回0~1内的随机数ROUND(x,y)返回x四舍五入后有y位小数的数值TRUNCATE(
Stella981 Stella981
4年前
LeetCode 69 题
1.题目要求实现 intsqrt(intx) 函数。计算并返回 _x_ 的平方根,其中 _x_ 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例1:输入:4输出:2示例2:输入:8输出:2说
Stella981 Stella981
4年前
JVM 字节码指令表
字节码助记符指令含义0x00nop什么都不做0x01aconst\_null将null推送至栈顶0x02iconst\_m1将int型1推送至栈顶0x03iconst\_0将int型0推送至栈顶0x04iconst\_1将int型1推送至栈顶0x05ic
小万哥 小万哥
2年前
Java 数学运算与条件语句全解析
JavaMathJava的Math类拥有许多方法,允许您在数字上执行数学任务。常用方法:Math.max(x,y):找到x和y的最大值Math.min(x,y):找到x和y的最小值Math.sqrt(x):返回x的平方根Math.abs(x):返回x的绝对