|
| 1 | +use std::cmp::max; |
| 2 | +use std::cmp::min; |
| 3 | + |
| 4 | +impl Solution { |
| 5 | + // Convert string vectors to individual int values. Then find the last arrival day among both along with first leaving day for both. Then loop through the months from last arrival day to first leaving day, taking care that only pending days are counted from first and last months |
| 6 | + pub fn count_days_together(arrive_alice: String, leave_alice: String, arrive_bob: String, leave_bob: String) -> i32 { |
| 7 | + let days_in_months: Vec<i32> = vec![31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; |
| 8 | + let arrive_alice_split_obj: Vec<&str> = arrive_alice.split("-").collect(); |
| 9 | + let leave_alice_split_obj: Vec<&str> = leave_alice.split("-").collect(); |
| 10 | + let arrive_bob_split_obj: Vec<&str> = arrive_bob.split("-").collect(); |
| 11 | + let leave_bob_split_obj: Vec<&str> = leave_bob.split("-").collect(); |
| 12 | + |
| 13 | + let arrive_alice_obj = [arrive_alice_split_obj[0].parse::<i32>().unwrap(), arrive_alice_split_obj[1].parse::<i32>().unwrap()]; |
| 14 | + let leave_alice_obj = [leave_alice_split_obj[0].parse::<i32>().unwrap(), leave_alice_split_obj[1].parse::<i32>().unwrap()]; |
| 15 | + let arrive_bob_obj = [arrive_bob_split_obj[0].parse::<i32>().unwrap(), arrive_bob_split_obj[1].parse::<i32>().unwrap()]; |
| 16 | + let leave_bob_obj = [leave_bob_split_obj[0].parse::<i32>().unwrap(), leave_bob_split_obj[1].parse::<i32>().unwrap()]; |
| 17 | + |
| 18 | + let arrive_common_month = if arrive_alice_obj[0] > arrive_bob_obj[0] { |
| 19 | + arrive_alice_obj[0] |
| 20 | + } else { |
| 21 | + arrive_bob_obj[0] |
| 22 | + }; |
| 23 | + |
| 24 | + let arrive_common_date = if arrive_alice_obj[0] > arrive_bob_obj[0] { |
| 25 | + arrive_alice_obj[1] |
| 26 | + } else if arrive_alice_obj[0] < arrive_bob_obj[0] { |
| 27 | + arrive_bob_obj[1] |
| 28 | + } else { |
| 29 | + max(arrive_alice_obj[1], arrive_bob_obj[1]) |
| 30 | + }; |
| 31 | + |
| 32 | + let leave_common_month = if leave_alice_obj[0] < leave_bob_obj[0] { |
| 33 | + leave_alice_obj[0] |
| 34 | + } else { |
| 35 | + leave_bob_obj[0] |
| 36 | + }; |
| 37 | + |
| 38 | + let leave_common_date = if leave_alice_obj[0] < leave_bob_obj[0] { |
| 39 | + leave_alice_obj[1] |
| 40 | + } else if leave_alice_obj[0] > leave_bob_obj[0] { |
| 41 | + leave_bob_obj[1] |
| 42 | + } else { |
| 43 | + min(leave_alice_obj[1], leave_bob_obj[1]) |
| 44 | + }; |
| 45 | + |
| 46 | + let mut result = 0; |
| 47 | + for current_month in arrive_common_month..=leave_common_month { |
| 48 | + if current_month == arrive_common_month { |
| 49 | + if current_month == leave_common_month { |
| 50 | + result += max((leave_common_date - arrive_common_date + 1), 0); |
| 51 | + } else { |
| 52 | + result += days_in_months[(current_month as usize) - 1] - arrive_common_date + 1; |
| 53 | + } |
| 54 | + |
| 55 | + } else if current_month == leave_common_month { |
| 56 | + result += leave_common_date; |
| 57 | + } else { |
| 58 | + result += (days_in_months[(current_month as usize) - 1]); |
| 59 | + } |
| 60 | + } |
| 61 | + |
| 62 | + return result; |
| 63 | + } |
| 64 | +} |
0 commit comments