मान लीजिए हमें ProductOfNumbers नामक क्लास को इम्प्लीमेंट करना है जो दो मेथड्स को सपोर्ट करता है:
add(int num): यह नंबर num को वर्तमान नंबर्स की लिस्ट के अंत में जोड़ता है।
getProduct(int k): यह वर्तमान लिस्ट में अंतिम k नंबर्स का उत्पाद लौटाता है।
हम मान सकते हैं कि वर्तमान लिस्ट में हमेशा कम से कम k नंबर्स होते हैं। उदाहरण के लिए, अगर इनपुट है: add(3), add(0), add(2), add(5), add(4), getProduct(2), getProduct(3), getProduct(4), add(8), getProduct(2), तो आउटपुट होगा (प्रत्येक फंक्शन कॉल के बाद):
[3], [3, 0], [3, 0, 2], [3, 0, 2, 5], [3, 0, 2, 5, 4], फिर (5 * 4) = 20, फिर (2 * 5 * 4) = 40, फिर (0 * 2 * 5 * 4) = 0, फिर [3, 0, 2, 5, 4, 8], फिर (4 * 8) = 32।
इसे हल करने के लिए, हम इन स्टेप्स को फॉलो करेंगे:
इनिशियलाइज़ेशन सेक्शन में, यह एक ऐरे बनाएगा, और इसमें 1 डालेगा
add() मेथड num लेगा:
अगर num 0 है, तो ऐरे को क्लियर करें, और 1 इंसर्ट करें, अन्यथा लास्ट_एलिमेंट * num को ऐरे में इंसर्ट करें
getProduct() मेथड k को इनपुट के रूप में लेगा:
n := ऐरे का साइज
अगर k > n - 1, तो 0 लौटाएं, अन्यथा dp[n - 1] / dp[n - k - 1]
उदाहरण (C++)
बेहतर समझ के लिए निम्न इम्प्लीमेंटेशन देखें:
#include <bits/stdc++.h>
using namespace std;
class ProductOfNumbers {
public:
vector <int> dq;
ProductOfNumbers() {
dq.push_back(1);
}
void add(int num) {
if(num == 0){
dq.clear();
dq.push_back(1);
}
else{
dq.push_back(dq.back() * num);
}
}
int getProduct(int k) {
int n = (int)dq.size();
return k > n - 1? 0 : dq[n - 1] / dq[n - k - 1];
}
};
int main(){
ProductOfNumbers ob;
(ob.add(3));
(ob.add(0));
(ob.add(2));
(ob.add(5));
(ob.add(4));
cout << (ob.getProduct(2)) << endl;
cout << (ob.getProduct(3)) << endl;
cout << (ob.getProduct(4)) << endl;
(ob.add(8));
cout << (ob.getProduct(2)) << endl;
}
इनपुट
add(3) add(0) add(2) add(5) add(4) getProduct(2) getProduct(3) getProduct(4) add(8) getProduct(2)
आउटपुट
20 40 0 32