C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で次に近い時間


「HH:MM」の形式で表される時刻があるとすると、現在の数字を再利用して次に近い時刻を生成する必要があります。数字は何度でも使用できます。

したがって、入力が「19:34」の場合、出力は「19:39」になります。これは、数字1、9、3、4から選択した次に近い時刻が19:39であるためです。これは23時間59分後に発生するため、19:33ではありません。

これを解決するには、次の手順に従います-

  • 関数eval()を定義します。これにはxが必要です

  • a:=x[0]を文字列に変換

  • a:=a + x [1]

  • b:=x[2]を文字列に変換

  • b:=b + x [3]

  • aを整数として返す*60+bを整数として返す

  • メインの方法から、次のようにします-

  • ret:=空白の文字列

  • temp:=空白の文字列

  • diff:=inf

  • 配列時間を定義する

  • 時間の終わりにt[0]を挿入します

  • 時間の終わりにt[1]を挿入します

  • 時間の終わりにt[3]を挿入します

  • 時間の終わりにt[4]を挿入します

  • n:=時間のサイズ

  • src:=空白の文字列

  • temp1:=空白の文字列

  • temp2:=空白の文字列

  • 初期化i:=0の場合、i

    • src:=src + time [i]

  • 初期化i:=0の場合、i

    • 初期化j:=0の場合、j

      • 初期化k:=0の場合、k

        • 初期化l:=0の場合、l

        • temp1:=time [i]

        • temp1:=temp1 + time [j]

        • temp2:=time [k]

        • temp2:=temp2+時間[l]

        • temp1が23を超える場合、またはtemp2が59を超える場合、-

          • 次の部分を無視し、次の反復にスキップします

        • temp:=temp1 + temp2

        • tempがsrcと同じ場合、-

          • 次の部分を無視し、次の反復にスキップします

        • newDiff:=eval(temp --eval(src))

        • newDiff <0の場合、-

          • newDiff:=newDiff +(60 * 24)

        • newDiff

          • diff:=newDiff

          • ret:=temp1 + ":" + temp2

  • return(retのサイズが0と同じ場合は、t、それ以外の場合はret)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
   int eval(string x){
      string a = to_string(x[0]);
      a += x[1];
      string b = to_string(x[2]);
      b += x[3];
      return stoi(a) * 60 + stoi(b);
   }
   string nextClosestTime(string t) {
      string ret = "";
      string temp = "";
      int diff = INT_MAX;
      vector<char> time;
      time.push_back(t[0]);
      time.push_back(t[1]);
      time.push_back(t[3]);
      time.push_back(t[4]);
      int n = time.size();
      string src = "";
      string temp1 = "";
      string temp2 = "";
      for (int i = 0; i < n; i++)
         src += time[i];
      for (int i = 0; i < n; i++) {
         for (int j = 0; j < n; j++) {
            for (int k = 0; k < n; k++) {
               for (int l = 0; l < n; l++) {
                  temp1 = time[i];
                  temp1 += time[j];
                  temp2 = time[k];
                  temp2 += time[l];
                  if (stoi(temp1) > 23 || stoi(temp2) > 59)
                     continue;
                  temp = temp1 + temp2;
                  if (temp == src)
                     continue;
                  int newDiff = eval(temp) - eval(src);
                  if (newDiff < 0)
                     newDiff += (60 * 24);
                  if (newDiff < diff) {
                     diff = newDiff;
                     ret = temp1 + ":" + temp2;
                  }
               }
            }
         }
      }
      return ret.size() == 0 ? t : ret;
   }
};
main(){
   Solution ob;
   cout<<(ob.nextClosestTime("19:34"));
}

入力

"19:34"

出力

19:39

  1. C++での文字列のトークン化

    このセクションでは、C++で文字列をトークン化する方法を説明します。 Cでは、文字配列にstrtok()関数を使用できます。ここに文字列クラスがあります。次に、その文字列から区切り文字を使用して文字列を切り取る方法を説明します。 C ++機能を使用するには、文字列を文字列ストリームに変換する必要があります。次に、getline()関数を使用して、タスクを実行できます。 getline()関数は、文字列ストリーム、出力を送信するための別の文字列、およびストリームのスキャンを停止するための区切り文字を受け取ります。 関数がどのように機能しているかを理解するために、次の例を見てみましょう。 サン

  2. C ++で文字列をトークン化しますか?

    最初の方法は、文字列ストリームを使用して、スペースで区切られた単語を読み取ることです。これは少し制限されていますが、適切なチェックを提供すれば、タスクはかなりうまくいきます。 例 #include <vector> #include <string> #include <sstream> using namespace std; int main() {    string str("Hello from the dark side");    string tmp; // A string