这道题就是让你写一个函数用来判断一个是num是否为某个数m的平方的。
解法一:暴力搜索法
判断一个数是不是某个数的平方,暴力一点的想法,就是从i = 1开始循环,如果i*i小于num,则i++;如果等于num,则返回true;如果大于num,则返回false。
public static boolean isPerfectSquare(int num) {
if(num <= 0)
return false;
if(num == 1)
return true;
for(int i=1;i<num;i++){
if(i*i < num){
continue;
}else if(i*i == num){
return true;
}else{
return false;
}
}
return false;
}
解法二:公式法
如果一个数num是完全平方数,那么一定存在一个n使得1+3+5+...+n = num。
public static boolean isPerfectSquare1(int num) {
if(num <= 0)
return false;
if(num == 1)
return true;
int sum = 1;
while(num > 0){
num -= sum;
sum += 2;
}
return num == 0;
}
解法三:双指针二分逼近法
思路是使用左右两个指针 left 和 right 来表示从1到num之间的两个数,并计算mid = (left+right)/2,如果mid*mid == num则返回true;如果小于num,则说明如果存在一个数n使得n*n == num的话,那么n一定大于mid,所以修改left = mid+1进行下一次比较;同理,如果大于num,则修改right = mid-1。(不要使用left = left+1这种方式,这样就失去二分的效果了)
public static boolean isPerfectSquare2(int num) {
if(num <= 0)
return false;
if(num == 1)
return true;
long l=1, r = num/2;
long mid, midSq;
while(l <= r){
mid = (l + r)/2;
midSq = mid * mid;
if(midSq == num) return true;
if(midSq < num) l = mid+1;
else r = mid-1;
}
return false;
}