晚上赶在睡觉之前AC的,好久没有刷过题目了。题目描述如下:

We define the Perfect Number is a positive integer that is equal to the sum of all its positive divisors except itself.
Now, given an integer n, write a function that returns true when it is a perfect number and false when it is not.
Example:
Input: 28
Output: True
Explanation: 28 = 1 + 2 + 4 + 7 + 14

题目大意是,给定一个数字,判断该数字是否是完美数字,完美数字的定义是,该数字等于所有约数的和。

题目不是很难,可以直接暴力搜索,遍历找到该数字的约数,求和再比较即可。但是如果直接暴力搜索,我推测一般会超时。所以最好进行一定的优化。

假定给定数字为num,遍历的数字为i。明显可知,[num / i, num]这个范围内的数字不可能是num的约数了,因此,每次i增加时,可以同时更新中止条件,这样能省下来很大一部分时间,具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public boolean checkPerfectNumber(int num) {
// 1为特例,需要额外处理
if (num == 1) {
return false;
}
int sum = 1, i = 2, j = num;
while(i < j) {
// 更新j
j = num / i;
if (num % i == 0) {
// i是num的公约数,那么j也是公约数
sum += i;
sum += j;
}
i++;
}
return num == sum;
}
}

最终提交结果AC,超过了96.47%的提交,但是占用内存较多,不知道是什么原因(也不知道内存占用这项数据什么时候上线的)。