问题描述
小F有一个由歌曲组成的列表,每首歌的持续时间用数组 time
表示,其中第 i
首歌的时长为 time[i]
秒。她想知道列表中有多少对歌曲的总持续时间能够被 10
整除。具体来说,我们希望找到所有满足 i < j
且 (time[i] + time[j]) % 10 == 0
的配对。
例如,给定 time = [3, 2, 15, 1, 4]
,有一对歌曲(time[2]
和 time[4]
)的时长和为 19 秒,能够被 10 整除。
测试样例
样例1:
输入:
time = [3, 2, 15, 1, 4]
输出:0
样例2:
输入:
time = [10, 20, 30]
输出:3
样例3:
输入:
time = [7, 3, 5, 5, 10]
输出:2
问题理解
我们需要找到数组 time
中所有满足 i < j
且 (time[i] + time[j]) % 10 == 0
的配对数量。这意味着我们需要检查每一对歌曲的时长和是否能被 10 整除。
数据结构选择
我们可以使用一个数组或哈希表来记录每个歌曲时长对 10 取余后的结果出现的次数。这样可以在一次遍历中统计出所有可能的配对。
算法步骤
- 初始化计数器:用于记录满足条件的配对数量。
- 遍历数组:对于每个歌曲时长
time[i]
,计算其对 10 取余的结果time[i] % 10
。 - 统计配对:对于每个
time[i] % 10
,检查是否存在另一个time[j] % 10
使得(time[i] % 10 + time[j] % 10) % 10 == 0
。 - 更新计数器:根据统计结果更新计数器。
具体步骤
- 创建一个大小为 10 的数组
count
,用于记录每个余数出现的次数。 - 遍历
time
数组,对于每个time[i]
,计算time[i] % 10
并更新count
数组。 - 对于每个
time[i]
,检查(10 - time[i] % 10) % 10
在count
数组中的值,并累加到计数器中。
通过这种方式,我们可以在一次遍历中完成所有配对的统计,时间复杂度为 O(n)。
代码实现
#include <vector>
#include <iostream>
int solution(std::vector<int> time) {
// 初始化一个数组来记录每个余数出现的次数
std::vector<int> count(10, 0);
int result = 0;
// 遍历 time 数组
for (int t : time) {
int remainder = t % 10;
// 计算互补的余数
int complement = (10 - remainder) % 10;
// 累加互补余数的出现次数到结果中
result += count[complement];
// 更新当前余数的出现次数
count[remainder]++;
}
return result;
}
int main() {
std::cout << (solution({3, 2, 15, 1, 4}) == 0) << std::endl;
std::cout << (solution({10, 20, 30}) == 3) << std::endl;
std::cout << (solution({7, 3, 5, 5, 10}) == 2) << std::endl;
return 0;
}