前言说明
算法学习,日常刷题记录。
题目连接
题目内容
给你一个整数数组nums,请你返回该数组中恰有四个因数的这些整数的各因数之和。
如果数组中不存在满足题意的整数,则返回0。
示例:
输入:nums = [21,4,7]
输出:32
解释:
21有4个因数:1, 3, 7, 21
4有3个因数:1, 2, 4
7有2个因数:1, 7
答案仅为21的所有因数的和。
提示:
1 <= nums.length <= 10^4
1 <= nums[i] <= 10^5
分析过程
枚举法,遍历数组nums,逐个判断元素是否符合四因数的条件,符合条件的各因数相加,最后把它们的和再相加。
第一步
定义所有符合条件的整数的各因数之和sumTotal,初始为0。
第二步
遍历数组nums,统计符合条件的整数的各因数之和。
第三步
统计整数的各因数之和时:
定义单个整数的各因数之和为sumNum,初始为0。
定义单个整数的各因数数量为countNum,初始为0。
从1遍历到整数的开方即可,因为开方之后的因数都是和前面部分的因数成对出现的。
通过取余是否等于0来判断是否是因数,若等于0,那么是因数,否则不是因数。
再通过这个整数除以当前因数,获取和这个因数匹对的另一个因数divide。
若两个因数相等,那么因数数量只算作一个,countNum累加1,各因数之和sumNum只累加一个因数,例如4 = 2 * 2,9 = 3 * 3。
若两个因数不相等,那么另一个因数在开方之后的那边,因数数量有两个,countNum累加2,各因数之和sumNum也累加两个因数。
若因数数量countNum超过了4个,那么这个数肯定不符合四个因数的条件了,直接结束循环。
第四步
每次统计完一个整数的各因数之和,都进行一个判断,判断因数个数是否刚好为四个。
若刚好为四个,那么符合条件,把单个整数的各因数之和sumNum,累加到所有符合条件的整数的各因数之和sumTotal。
第五步
最后,返回所有符合条件的整数的各因数之和sumTotal。
解答代码
class Solution {
public int sumFourDivisors(int[] nums) {
// 枚举法,遍历数组nums,逐个判断元素是否符合四因数的条件,符合条件的各因数相加,最后把它们的和再相加
// 定义所有符合条件的整数的各因数之和
int sumTotal = 0;
// 遍历数组nums
for (int num : nums) {
// 定义单个整数的各因数之和
int sumNum = 0;
// 定义单个整数的各因数数量
int countNum = 0;
// 从1遍历到整数的开方,因为开方之后的因数都是和前面部分的因数成对出现的
for (int i = 1; i * i <= num; ++i) {
// 通过取余是否等于0判断是否是因数
if (num % i == 0) {
// 取和这个因数匹对的另一个因数
int divide = num / i;
if (i == divide) {
// 若两个因数相等,那么因数数量只算作一个,各因数之和只累加一个因数,例如4 = 2 * 2
++countNum;
sumNum += i;
} else {
// 若两个因数不相等,那么另一个因数在开方之后的那边,因数数量有两个,各因数之和也累加两个因数
countNum += 2;
sumNum += i;
sumNum += divide;
}
if (countNum > 4) {
// 若因数数量超过了4个,那么这个数肯定不符合四个因数的条件了,直接结束循环
break;
}
}
}
if (countNum == 4) {
// 只有刚好四个因数的数才是符合条件的,把单个整数的各因数之和累加到所有符合条件的整数的各因数之和
sumTotal += sumNum;
}
}
// 最后返回所有符合条件的整数的各因数之和
return sumTotal;
}
}
提交结果
执行用时9ms,时间击败100.00%的用户,内存消耗38.6MB,空间击败34.75%的用户。
运行结果原文链接
原文链接:四因数
网友评论