Some people will make friend requests. The list of their ages is given and ages[i]
is the age of the ith person.
Person A will NOT friend request person B (B != A) if any of the following conditions are true:
age[B] <= 0.5 * age[A] + 7
age[B] > age[A]
age[B] > 100 && age[A] < 100
Otherwise, A will friend request B.
Note that if A requests B, B does not necessarily request A. Also, people will not friend request themselves.
How many total friend requests are made?
Example 1:
Input: [16,16] Output: 2 Explanation: 2 people friend request each other.
Example 2:
Input: [16,17,18] Output: 2 Explanation: Friend requests are made 17 -> 16, 18 -> 17.
Example 3:
Input: [20,30,100,110,120] Output: 3 Explanation: Friend requests are made 110 -> 100, 120 -> 110, 120 -> 100.
Notes:
1 <= ages.length <= 20000
.1 <= ages[i] <= 120
.struct Solution;
use std::collections::HashMap;
impl Solution {
fn num_friend_requests(ages: Vec<i32>) -> i32 {
let mut hm: HashMap<i32, i32> = HashMap::new();
for age in ages {
*hm.entry(age).or_default() += 1;
}
let mut res = 0;
for (&a, v) in &hm {
for (&b, u) in &hm {
if !(b > a || 2 * b <= a + 14) {
res += v * u;
if a == b {
res -= v;
}
}
}
}
res
}
}
#[test]
fn test() {
let ages = vec![16, 16];
let res = 2;
assert_eq!(Solution::num_friend_requests(ages), res);
let ages = vec![16, 17, 18];
let res = 2;
assert_eq!(Solution::num_friend_requests(ages), res);
let ages = vec![20, 30, 100, 110, 120];
let res = 3;
assert_eq!(Solution::num_friend_requests(ages), res);
let ages = vec![73, 106, 39, 6, 26, 15, 30, 100, 71, 35, 46, 112, 6, 60, 110];
let res = 29;
assert_eq!(Solution::num_friend_requests(ages), res);
}