LeetCode 50 pow(x,n) 与 java中的数组越界问题

这题参考了leetcode官方题解中的迭代法思路,主要是结合了二进制位运算的优势以及结合二进制表示数的特点进行求解。

class Solution {
    public double myPow(double x, int n) {
        if (n == 0) return 1.0;
        long N = n;
        boolean isPos = N > 0 ? true : false;
        N = Math.abs(N);
        double res = 1;
        double tmp = x;
        for(int i = 0; i < 32; i ++) {
            long addOrNot = N & 1;
            if (addOrNot == 1) res *= tmp;
            tmp *= tmp;
            N >>= 1;    
       }
       return isPos ? res : 1.0 / res;
    }

解体的时候需要注意一个取绝对值的时候的越界问题,因为n如果取了最小值,即32位的,不管取绝对值也好,前面添加符号也好,都是原来的最小值,因此会对逻辑产生影响。因此采用long类型的变量来避免额外的错误。

        int i = Integer.MIN_VALUE;
        System.out.println(i);
        System.out.println(-i);
        System.out.println(Math.abs(i));

对应输出结果为

发表评论

电子邮件地址不会被公开。 必填项已用*标注