ধরুন একটি সিঙ্গেল থ্রেডেড সিপিইউতে আমরা কিছু ফাংশন এক্সিকিউট করি। এখন প্রতিটি ফাংশনের 0 এবং N-1 এর মধ্যে একটি অনন্য আইডি রয়েছে। আমরা টাইমস্ট্যাম্প ক্রমানুসারে লগগুলি সংরক্ষণ করব যা বর্ণনা করে যে কখন একটি ফাংশন প্রবেশ করা হয় বা প্রস্থান করা হয়৷
এখানে প্রতিটি লগ এই বিন্যাসে লেখা একটি স্ট্রিং:"{function_id}:{"start" | "end"}:{timestamp}"। উদাহরণস্বরূপ, যদি স্ট্রিংটি "0:start:3" এর মত হয় এর মানে হল যে 0 আইডি সহ ফাংশনটি টাইমস্ট্যাম্প 3 এর শুরুতে শুরু হয়েছে৷ "1:end:2" মানে টাইমস্ট্যাম্পের শেষে 1 এর সাথে ফাংশনটি শেষ হয়েছে 2. একটি ফাংশনের একচেটিয়া সময় হল এই ফাংশনে ব্যয় করা সময়ের এককের সংখ্যা৷
সুতরাং ইনপুট যদি n =2 এবং লগ =["0:start:0","1:start:2","1:end:5","0:end:6"] এর মত হয়, তাহলে আউটপুট হবে হতে [3,4]। এর কারণ হল ফাংশন 0 সময় 0 এর শুরুতে শুরু হয়, তারপর এটি সময়ের 2 ইউনিট নির্বাহ করে এবং সময়ের 1 এর শেষে পৌঁছায়। এর পরে ফাংশন 1 সময় 2 এর শুরুতে শুরু হয়, সময়ের 4 ইউনিট কার্যকর করে এবং 5 এ শেষ হয় ফাংশন 0 আবার চলছে সময় 6 এর শুরুতে, এবং সময় 6 এর শেষেও শেষ হয়, এইভাবে 1 ইউনিট সময়ের জন্য কার্যকর করা হয়। সুতরাং আমরা দেখতে পাচ্ছি যে ফাংশন 0 মোট সময়ের 2 + 1 =3 ইউনিট ব্যয় করে এবং ফাংশন 1 মোট সময় নির্বাহের 4 ইউনিট ব্যয় করে।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
n আকারের একটি অ্যারে রেট সংজ্ঞায়িত করুন, স্ট্যাক st সংজ্ঞায়িত করুন
-
j :=0, আগের :=0
-
আমি 0 থেকে লগ অ্যারের আকার - 1
এর মধ্যে-
temp :=logs[i], j :=0, id :=0, num :=0, টাইপ :=খালি স্ট্রিং
-
-
যখন temp[j] একটি কোলন নয়
-
id :=id * 10 + temp[j] সংখ্যা হিসাবে
-
1 দ্বারা j বাড়ান
-
-
1 দ্বারা j বাড়ান
-
যখন temp[j] একটি কোলন নয়
-
টাইপ :=টাইপ কনক্যাটেনেট টেম্প[জে]
-
1 দ্বারা j বাড়ান
-
-
1 দ্বারা j বাড়ান
-
যখন j <তাপমাত্রার আকার
-
num :=num * 10 + temp[j] সংখ্যা হিসাবে
-
1 দ্বারা j বাড়ান
-
-
যদি টাইপ =শুরু, তারপর
-
যদি st খালি না হয়
-
ret[স্ট্যাক টপ এলিমেন্ট] num – prev
দ্বারা বাড়ান
-
-
d ঢোকান st, prev :=num
-
-
অন্যথায়
-
x :=st এর শীর্ষ, এবং স্ট্যাকের শীর্ষ মুছে দিন
-
ret[x] :=ret[x] + (সংখ্যা + 1) – আগের
-
পূর্ববর্তী :=সংখ্যা + 1
-
-
রিটার্ন রিটার্ন
উদাহরণ(C++)
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
#include <bits/stdc++.h> using namespace std; void print_vector(vector<auto> v){ cout << "["; for(int i = 0; i<v.size(); i++){ cout << v[i] << ", "; } cout << "]"<<endl; } class Solution { public: vector<int> exclusiveTime(int n, vector<string>& logs) { vector <int> ret(n); stack <int> st; int id, num; int j = 0; string temp; string type; int prev = 0; for(int i = 0; i < logs.size(); i++){ temp = logs[i]; j = 0; id = 0; num = 0; type = ""; while(temp[j] != ':'){ id = id * 10 + (temp[j] - '0'); j++; } j++; while(temp[j] != ':'){ type += temp[j]; j++; } j++; while(j < temp.size()){ num = num * 10 + temp[j] - '0'; j++; } if(type == "start"){ if(!st.empty()){ ret[st.top()] += num - prev; } st.push(id); prev = num; } else { int x = st.top(); st.pop(); ret[x] += (num + 1) - prev; prev = num + 1; } } return ret; } }; main(){ vector<string> v = {"0:start:0","1:start:2","1:end:5","0:end:6"}; Solution ob; print_vector(ob.exclusiveTime(2, v)); }
ইনপুট
2 ["0:start:0","1:start:2","1:end:5","0:end:6"]
আউটপুট
[3, 4, ]