在给定的 HH:MM 格式时间内最大化缺失值


我们将得到一个长度为五的字符串,它表示 HH:MM 格式的时间。字符串中可能包含一些‘?’,我们必须用任何数字替换它们,使得结果是有效的时间,并且是可能的最大值。此外,给定的字符串数字将是有效的,并且‘:’将出现在字符串的精确位置。我们将使用两种方法:第一种是暴力方法,另一种是有效的方法。

示例

输入 1

Given string: 12:5?
Output: 12:59

解释

我们只有一个位置需要填充,我们可以获得的最大时间是 12:59。

输入 2

Given string: ?0:?9
Output: 20:59

解释

这里有两个空位,首先,我们将关注小时部分,我们有三个选择 0、1 和 2 来填充。对于分钟部分,我们有 0 到 5 的选择,为了最大化,我们可以填充 5。

方法

我们已经看到了示例,现在让我们看看我们可以面临的不同类型的案例:

  • 字符串有两个部分:小时部分和分钟部分。

  • 小时部分的范围是 0 到 23,分钟部分的范围是 0 到 59。

  • 小时部分有以下几种情况:

    • ‘x?’,其中 x 可以是 0、1 和 2。对于 0,我们可以使用 0 作为最佳值;对于 1,我们可以选择 9 作为最佳值;对于 2,我们可以使用 3 作为最佳值。

    • ‘?x’,其中 x 的范围是 0 到 9。如果 x 的范围是 0 到 3,那么我们可以用 2 替换它,否则 1 将是最佳值。

    • ‘??’,因为我们必须最大化,所以我们将用 23 替换它。

  • 分钟部分有以下几种情况:

    • ‘x?’,其中 x 的范围是 0 到 5。9 将是我们替换 ‘?’ 的最佳选择。

    • ‘?x’,其中 x 的范围是 0 到 9。5 将是我们替换 ‘?’ 的最佳选择。

    • ‘??’,因为我们必须最大化,所以我们将用 59 替换它。

让我们看看实现上述步骤的代码:

示例

#include <iostream>
using namespace std;
// function to replace hours
string replaceHours(string s){
   if(s[0] == '?' && s[1] == '?'){
      //Both hour characters are '?'
      // replace with the maximum hour we can achieve 
      s[0] = '2';
      s[1] = '3';
   }
   else if(s[0] == '?'){
      // if the second number of hours is in the range 0 to 3
      // replace by 2
      if(s[1] < 4){
         s[0] = '2';
      }
      else{
         s[0] = '1'; // otherwise replace by one 
      }
   }
   else if(s[1] == '?'){
      // if the first character is '2' we can go only upto 3
      if(s[0] == '2'){
         s[1] = '3';
      }
      else{
         s[1] = '9'; // else we can go for 9 
      }
   }
   return s;
}
// function to replace minutes
string replaceMinutes(string s){
   if(s[3] == '?' && s[4] == '?'){
      // both minutes characters are '?'
      // replace with maximum minutes we can acheive 
      s[3] = '5';
      s[4] = '9';
   }
   else if(s[3] == '?'){
      // we can maximum get 5 here 
      s[3] = '5';
   }
   else if(s[4] == '?'){
      // we can get maximum 9 here
      s[4] = '9';
   }
   return s;
}
int main(){
   string str = "2?:3?"; // given string 
   // calling the function for updation of the minutes 
   str = replaceMinutes(str);
   // calling to the function for updation of the hours
   str = replaceHours(str);
   // printing the final answer
   cout<<"The maximum time we can get by replacing ? is: "<< str<<endl;
   return 0;
}

输出

The maximum time we can get by replacing ? is: 23:39

时间和空间复杂度

上述代码的时间复杂度是 O(1) 或常数,因为我们没有使用任何循环或递归调用,只是检查 if-else 条件。

上述代码的空间复杂度是 O(1),因为我们没有使用任何额外的空间。此外,对于函数,我们传递字符串,但其大小始终为常数 5。

注意:为了使代码更美观或更易读,可以使用 switch 语句,它们不会影响时间或空间复杂度,并且会使代码更易于阅读。

此外,回溯和重新检查是一种解决方案,但这将检查每种情况,并且在这里实现效率不高。

结论

在本教程中,我们得到一个表示 24 小时制时间的字符串。字符串中有一些 ‘?’,我们必须用它们替换以获得有效最大时间,并且保证字符串中给定的字符始终导致有效时间。我们使用了 if-else 条件和两个函数来用适当的情况替换 ‘?’。上述代码的时间和空间复杂度为常数,因为我们没有使用任何循环或递归函数。

更新于:2023年5月16日

93 次浏览

开启您的职业生涯

完成课程获得认证

开始
广告