给你一个整数数组 hours
,表示以 小时 为单位的时间,返回一个整数,表示满足 i < j
且 hours[i] + hours[j]
构成 整天 的下标对 i
, j
的数目。
整天 定义为时间持续时间是 24 小时的 整数倍 。
例如,1 天是 24 小时,2 天是 48 小时,3 天是 72 小时,以此类推。
示例 1:
输入: hours = [12,12,30,24,24]
输出: 2
解释:
构成整天的下标对分别是
(0, 1)
和(3, 4)
。
示例 2:
输入: hours = [72,48,24,3]
输出: 3
解释:
构成整天的下标对分别是
(0, 1)
、(0, 2)
和(1, 2)
。
提示:
1 <= hours.length <= 5 * 10^5
1 <= hours[i] <= 10^9
我的解答:
class Solution {
public long countCompleteDayPairs(int[] hours) {
// 这里必须使用long类型数组
// 因为某些值的数量远大于int类型最大值,导致数值溢出(半天想不明白自己错在哪,看了题解才幡然醒悟T_T)
long[] hour = new long[24];
long res = 0;
for(int h : hours){
// 通过求余的方式将值的范围约束在0-23以内
hour[h % 24]++;
}
// 单独计算0跟12的组合,比较特殊
res += ( hour[0] * ( hour[0] - 1 )) / 2;
res += ( hour[12] * ( hour[12] - 1 )) / 2;
for(int i = 1; i < 12; i++){
res += hour[i] * hour[24-i];
}
return res;
}
}