标题
写这道题出现了一个我对于 if/else 的盲点
以前我是这样写的
if () {
}
if () {
}
else {
}
结果发现正确的应该是这样
if () {
}
else if () {
}
else {
}
问题描述
思路
- 可以使用双指针,一个指向 left ,一个指向 right
- 首先,令left = 0, right = sqrt(c)
- 可以想到,最奇特的情况是当 left = right , 并且 c == total = left * left + right * right ;
- 所以,这里将 left <= right 作为循环判断依据,当 left > right 时,跳出循环
- 在left & right 中间总会有一个逼近值,若 total > c ,则 right-- ;反之则 left ++ ;
代码实现(解法来源 leetcode 用户 @江不知)
public class Main {
public static void main(String[] args) {
Main m = new Main();
System.out.println(m.judgeSqrtNums(1000));
}
public static boolean judgeSqrtNums (int c) {
int left = 0;
// 将 c 开平方转 int
int right = (int) Math.sqrt(c);
while (left <= right) {
int total = left * left + right * right;
// 得数小于c,左边界增大
if (total < c) {
left++;
}
// 得数大于c,有边界减小
if (total > c) {
right--;
}
else return true;
}
return false;
}
}
PS: 我把 right-- 写成了 right++,导致 c=1000不能通过,所以这里把它作为测试用例,提醒自己。