Computer >> Máy Tính >  >> Lập trình >> C ++

Thời gian gần nhất tiếp theo trong C ++

Giả sử chúng ta có một thời gian được biểu diễn ở định dạng "HH:MM", chúng ta phải tạo thời gian gần nhất tiếp theo bằng cách sử dụng lại các chữ số hiện tại. Chúng ta có thể sử dụng chữ số không giới hạn số lần.

Vì vậy, nếu đầu vào là "19:34", thì đầu ra sẽ là "19:39" vì lần chọn gần nhất tiếp theo từ các chữ số 1, 9, 3, 4 là 19:39. Không phải là 19:33, vì điều này xảy ra sau 23 giờ 59 phút.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Xác định một hàm eval (), điều này sẽ lấy x,

  • a:=chuyển x [0] thành chuỗi

  • a:=a + x [1]

  • b:=chuyển x [2] thành chuỗi

  • b:=b + x [3]

  • trả về a dưới dạng số nguyên * 60 + b dưới dạng số nguyên

  • Từ phương thức chính, hãy làm như sau -

  • ret:=chuỗi trống

  • temp:=chuỗi trống

  • diff:=inf

  • Xác định thời gian của mảng

  • chèn t [0] vào cuối thời gian

  • chèn t [1] vào cuối thời gian

  • chèn t [3] vào cuối thời gian

  • chèn t [4] vào cuối thời gian

  • n:=kích thước thời gian

  • src:=chuỗi trống

  • temp1:=chuỗi trống

  • temp2:=chuỗi trống

  • để khởi tạo i:=0, khi i

    • src:=src + time [i]

  • để khởi tạo i:=0, khi i

    • để khởi tạo j:=0, khi j

      • để khởi tạo k:=0, khi k

        • để khởi tạo l:=0, khi l

        • temp1:=time [i]

        • temp1:=temp1 + thời gian [j]

        • temp2:=time [k]

        • temp2:=temp2 + time [l]

        • nếu temp1 là số> 23 hoặc temp2 là số> 59, thì -

          • Bỏ qua phần sau, chuyển sang phần tiếp theo

        • temp:=temp1 + temp2

        • nếu nhiệt độ giống như src, thì -

          • Bỏ qua phần sau, chuyển sang phần tiếp theo

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

        • nếu newDiff <0, thì -

          • newDiff:=newDiff + (60 * 24)

        • nếu newDiff

          • diff:=newDiff

          • ret:=temp1 + ":" + temp2

  • return (nếu kích thước của ret giống 0 thì t, ngược lại là ret)

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#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"));
}

Đầu vào

"19:34"

Đầu ra

19:39