Count Intervals That Intersects With a Given Meeting Time


Problem Statement

We have given a two-dimensional array containing the pairs of starting and ending times for time intervals in the 12-hour format. Also, we have given string str in the 12-hour time format. We need to find a total number of intervals which included the time represented by str.

Sample Examples

Input

arr[][2] = {{“12:02:AM”, “10:55:PM”}, 
{“12:51:AM”, “11:40:AM”}, 
{“01:30:AM”, “12:00:PM”}, 
{“11:57:PM”, “11:59:PM”}}, 
str = “2:30:AM”

Output

3

Explanation

The time “2:30:AM” intersects the first three intervals.

Input

arr[][2] = {{“01:02:PM”, “10:55:PM”}, 
{“01:30:AM”, “11:00:AM”}}, str = “11:30:PM”

Output

0

Explanation

The time ’11:30:PM’ doesn’t intersect any time intervals given in the array.

Approach 1

In this approach, we will convert the time into the 24-hour format. After that, we will count the total number of time intervals that intersect the given time by comparison. Also, we will use the substr() method to get substring and the stoi() method to convert the string to an integer.

Algorithm

  • Step 1 − Define the convertTime() function to convert time in the 24-hours format.

  • Step 1.1 − Use the replace() method to replace the colon at the third position with an empty string.

  • Step 1.2 − Get the first and second characters representing the hour from the given string, and convert them to hours by multiplying the first digit by 10 and adding the second digit.

  • Step 1.3 − Initialize the ‘time_24’ variable with zero.

  • Step 1.4 − We need to handle two cases to convert time to 24 hours. The first is in AM, and the second is in PM.

  • Step 1.4.1 − If the 5th character in the string is ‘A’, the time is in AM. If the time is in AM, and the hours are equal to 12, extract the minutes only from the string because we assume 12:00 AM as 00:00 hours. Otherwise, convert the time string to an integer value.

  • Step 1.4.2 − If the 5th character in the string is ‘P’, the time is in PM. Extract the time string, and convert it to an integer. Also, if hours are not equal to 12, add 1200 to the ‘time_24’ variable.

  • Step 2 − The convertTime() function will return the time in the below format.

    • 12:00:AM = 0000

    • 12:58:AM = 0059

    • 11:32:AM = 1132

    • 11:32:PM = 1200 + 1132 = 2332

    • 04:56:PM = 1200 + 456 = 1656

    • If the 5th character in the string is ‘A’, the time is in AM. If the time is in AM, and the hours are equal to 12, extract the minutes only from the string because we assume 12:00 AM as 00:00 hours. Otherwise, convert the time string to an integer value.

  • Step 3 − Convert the given time string to the 24-hour format.

  • Step 4 − Use the for loop to traverse the array of time intervals and convert each time string into the 24-hour format.

  • Step 5 − Also, keep checking whether the given time string is between current intervals. If yes, increase the count of ‘res’ by 1.

  • Step 6 − Return the value of the ‘res’ variable.

Example

#include <bits/stdc++.h>
using namespace std;
// Function to convert the given time_24 in 24 hours format
int convertTime(string str){
   // Remove the colon from the string
   str.replace(2, 1, "");
   // Stores the hour
   int char_h1 = (int)str[1] - '0';
   int char_h2 = (int)str[0] - '0';
   int hours = (char_h2 * 10 + char_h1 % 10);
   // variable to store the time in 24 hours format
   int time_24 = 0;
   // If the time is in "AM."
   if (str[5] == 'A'){
      // If hours are equal to 12, then update it to 0 as 12 AM, and only minutes to time_24
      if (hours == 12){
         time_24 += stoi(str.substr(2, 2));
      } else {
         // add hours and minutes to time_24
         time_24 += stoi(str.substr(0, 4));
      }
   }
   // If time is in "PM"
   else {
      // If hours is equal to 12, add time as it is to time_24
      if (hours == 12){
         time_24 += stoi(str.substr(0, 4));
      } else {
         // add time to time_24
         time_24 += stoi(str.substr(0, 4));
         // add 1200 = 12 : 00 PM to time_24 to convert in 24 hours format.
         time_24 += 1200;
      }
   }
   return time_24;
}
// Function to find the total number of intervals that intersects with given meeting time_24
int totalIntersects(string arr[][2], int len, string str){
   // to store the total number of intervals
   int res = 0;
   // convert the given time_24 in 24 hours format
   int convertedStr = convertTime(str);
   // Traverse the array
   for (int i = 0; i < len; i++){
      // convert the starting time_24 of the current interval in 24-hour format
      int initial = convertTime(arr[i][0]);
      // convert the ending time_24 of the current interval in 24-hour format
      int end = convertTime(arr[i][1]);
      // If the given time_24 lies in the interval [initial, end], then increment res by 1
      if ((initial <= convertedStr && convertedStr <= end) || (convertedStr >= end && convertedStr <= initial))
         res++;
   }
   // Return res
   return res;
}
int main(){
   string arr[][2] = {{"11:00:AM", "11:55:PM"},
                       {"12:19:AM", "9:30:AM"},
                       {"12:51:AM", "12:59:PM"},
                       {"6:57:AM", "7:50:PM"}};
   string str = "12:54:AM";
   int len = sizeof(arr) / sizeof(arr[0]);
   cout << "The total number of the interval that intersects with given meeting time_24 are - " << totalIntersects(arr, len, str) << endl;
}

Output

The total number of the interval that intersects with given meeting time_24 are - 2
  • Time complexity − O(N), as we iterate through the array of time intervals.

  • Space complexity − O(1), as we don’t use constant space.

While solving the above problem, users should mainly focus on converting time to a 24-hours format, and after that, they just need to do normal comparisons.

Updated on: 18-Jul-2023

40 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements