【剑指Offer】个人学习笔记_16_数值的整数次方

目录

刷题日期:18:5215 星期三2021年3月24日

个人刷题记录,代码收集,来源皆为leetcode

经过多方讨论和请教,现在打算往Java方向发力

主要答题语言为Java

题目:

剑指 Offer 16. 数值的整数次方

难度中等137

实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。不得使用库函数,同时不需要考虑大数问题。

示例 1:

输入:x = 2.00000, n = 10
输出:1024.00000

示例 2:

输入:x = 2.10000, n = 3
输出:9.26100

示例 3:

输入:x = 2.00000, n = -2
输出:0.25000
解释:2-2 = 1/22 = 1/4 = 0.25

提示:

  • -100.0 < x < 100.0
  • -231 <= n <= 231-1
  • -104 <= xn <= 104

题目分析

这道题开始进入书本的第三章,高质量的代码,自己平时写题也要注意代码规范等等。

提示限定了题目的数值范围。

最简单的乘法肯定是不行的,最后也会有其他不为常人所知的公式可以解题,只要能掌握中等的解法就可。

初始解答:

最简单的解法

class Solution {
    public double myPow(double x, int n) {
        double res = 1;
        for (int i = 0; i < n; i++) {
            res *= x;
        }
        return res;
    }
}

但是没有考虑n为负的情况,还得加上判断,以及x为0的情况。

不断增加边界输入的结果。

class Solution {
    public double myPow(double x, int n) {
        if (x == 0) return 1; //这里应该是不对的,return 0
        if (x == 1) return 1;
        double res = 1;
        if (n > 0) {
            for (int i = 0; i < n; i++) res *= x;
        }
        if (n < 0) {
        double y = 1 / x;
            for (int i = 0; i < (0-n); i++) res *= y;
        }
        
        return res;
    }
}

还是存在问题,这里没有理解为什么能错,x已经求过倒数,乘这么多遍,还能输出1。执行结果: 解答错误

显示详情

输入:

2.00000 -2147483648

输出:

1.00000

预期结果:

0.0

Summer1121 (编辑过)2020-03-01

-2147483648这个指数也很有意思呢,如果为了用移位取代除法来加速,负数是用补码表示的,补码的除法逻辑又不能用移位来解决…就需要取n的绝对值…因为int的取值范围是-2147483648到2147483647…所以java的Math.abs(n)在这个时候返回的还是-2147483648…leetcode的用例还是秀,这种边界…

Java 代码中 int32 变量 n \in [-2147483648, 2147483647]n∈[−2147483648,2147483647] ,因此当 n = -2147483648n=−2147483648 时执行 n = -nn=−n 会因越界而赋值出错。解决方法是先将 nn存入 long 变量 b ,后面用 bb 操作即可。

作者:jyd
链接:https://leetcode-cn.com/problems/shu-zhi-de-zheng-shu-ci-fang-lcof/solution/mian-shi-ti-16-shu-zhi-de-zheng-shu-ci-fang-kuai-s/
来源:力扣(LeetCode)

看来不是我自己一个人卡在这里,按照官方精选的方法二改正了一番,还是卡在这里,也没有看到有循环解出来的,还是放弃了。这里参考方法一,用了书里的公式,递归实现

class Solution {
    public double myPow(double x, int n) {
        if(n == 0) return 1;    //特殊情况
        if(n == 1) return x;    //特殊情况
        if(n == -1) return 1/x;
        double half = myPow(x,n / 2); //为偶数的话直接先求一半的
        double mod = myPow(x, n % 2); //为奇数的话这一项就为x,否则为1
        return half * half * mod; //不论奇偶都能直接通过
    }
}

执行结果:

通过

显示详情

执行用时:1 ms, 在所有 Java 提交中击败了98.50%的用户

内存消耗:37.9 MB, 在所有 Java 提交中击败了20.28%的用户

然后学习了官方精选的迭代解法,就不再敲一遍了。

学习他人:

方法一

递归

b扣

上一篇:python 操作.mat文件


下一篇:机器学习算法整理(内含代码)