乐趣区

关于java:Leetcode刷题367有感

题目

办法体

class Solution {public boolean isPerfectSquare(int num) {}}

思路

不必内置函数 sqrt,判断一个 num,是否是齐全平方数,只有证实 a * a < num,(a+1)*(a+1) > num 即可。
如何疾速找到 a?我想到的第一个办法就是二分法。

代码

    public boolean isPerfectSquare(int num) {return er(0, num, num);
    }

    public boolean er(int min, int max, int num) {if (min > max) {return false;}
        int mid = (min + max) / 2;
        int s = mid * mid;
        if (s > num) {return er(min, mid - 1, num);
        } else if (s < num) {return er(mid + 1, max, num);
        } else {return true;}
    }

问题

为什么这么小一件事我还要写个文章记录下呢?因为我写完下面的代码,单元测试没问题后,间接提交 leetcode,后果错了。起因是int s = mid * mid,这里我竟然没有思考到类型问题。两个 int 类型的乘积,会有可能大于 int 类型的最大值。联想到本人的开发生涯,真的很少有去思考范畴溢出问题。

退出移动版