समस्या
हमें एक जावास्क्रिप्ट फ़ंक्शन लिखना है जो दो नंबर लेता है, आइए उन्हें क्रमशः पहले और दूसरे तर्क के रूप में m और n कहते हैं।
हमारे फ़ंक्शन का कार्य संख्या m से n अंकों को हटाना है ताकि n अंकों को हटाने के बाद संख्या m सबसे छोटी संभव संख्या हो। और अंत में, अंकों को हटाने के बाद फ़ंक्शन को संख्या m वापस करनी चाहिए।
उदाहरण के लिए, यदि फ़ंक्शन का इनपुट है -
const m = '45456757'; const n = 3;
तब आउटपुट होना चाहिए -
const output = '44557';
आउटपुट स्पष्टीकरण:
हमने सबसे छोटी संभव संख्या प्राप्त करने के लिए 5, 6 और 7 अंक हटा दिए।
उदाहरण
इसके लिए कोड होगा -
const m = '45456757'; const n = 3; const removeDigits = (m, n, stack = []) => { let arr = m.split('').map(Number); for(let el of arr){ while (n && stack.length && el < stack[stack.length - 1]){ stack.pop(); --n; }; stack.push(el); }; let begin = stack.findIndex(el => el > 0); let end = stack.length - n; return (!stack.length || begin == -1 || begin == end) ? "0" : stack.slice(begin, end).join('').toString(); }; console.log(removeDigits(m, n));
कोड स्पष्टीकरण:
हमने यहां उत्तर तैयार करने के लिए एक स्टैक का उपयोग करके एक लालची एल्गोरिथ्म का उपयोग किया है। बाएँ से दाएँ इनपुट स्ट्रिंग संख्या के प्रत्येक मान el के लिए, हम el को स्टैक पर धकेलते हैं जब हम स्टैक से n मान तक हटा देते हैं जो el से अधिक होते हैं।
चूंकि किसी संख्या के बाएं-सबसे अधिक स्थान दाएं-सबसे अधिक पदों की तुलना में अधिक मूल्यवान होते हैं, यह लालची दृष्टिकोण सुनिश्चित करता है कि सबसे बाएं स्थान सबसे छोटे अंकों से बने होते हैं, और स्टैक में जो कुछ भी बचा है वह दाईं ओर सबसे बड़ा अंक है- अधिकांश पद।
इनपुट स्ट्रिंग m को संसाधित करने के बाद यदि कोई शेष n अंक निकालने के लिए हैं, तो दाएं-सबसे n अंक हटा दें, क्योंकि दाएं-सबसे n अंक सबसे बड़े अंक हैं।
आउटपुट
और कंसोल में आउटपुट होगा -
44557