题目
办法体
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类型的最大值。联想到本人的开发生涯,真的很少有去思考范畴溢出问题。