मान लीजिए हमारे पास एक संख्या n है, हमें वह निकटतम संख्या प्राप्त करनी है जो पालिंड्रोम है। तो पालिंड्रोम उस संख्या से कम या अधिक हो सकता है जिसका निरपेक्ष अंतर छोटा हो। तो यदि संख्या 145 जैसी है, तो परिणाम 141 होगा।
इसे हल करने के लिए, हम निम्न चरणों का पालन करेंगे -
- sn := n का आकार
- यदि sn, 1 के समान है, तो -
- n[0] को 1 से घटाएं और n[0] के आकार की 1s की स्ट्रिंग वापस करें
- half_sn := (sn + 1) / 2
- half_val := n के इंडेक्स 0 से half_sn तक के सबस्ट्रिंग का stol
- एक ऐरे candidates = {10^(sn) - 1, 10^(sn - 1) - 1, 10^(sn - 1) + 1, 10^(sn)+1 परिभाषित करें
- एक ऐरे fmdc = { half_val, half_val - 1, half_val + 1 } परिभाषित करें
- fmds में प्रत्येक मान c के लिए
- rev := c को स्ट्रिंग में बदलें
- यदि sn mod 2 शून्येतर है, तो -
- rev से अंतिम तत्व हटाएं
- rev ऐरे को उल्टा करें
- candidates के अंत में c डालें
- candidates ऐरे को सॉर्ट करें
- val := n को पूर्णांक के रूप में
- candidates में प्रत्येक candidate के लिए -
- यदि candidate, val के समान है, तो -
- अगले भाग को अनदेखा करें, अगले पुनरावृत्ति पर जाएं
- diff := |candidate - val|
- यदि diff < min_diff, तो -
- min_diff := diff
- ans := candidate को स्ट्रिंग में बदलें
- यदि candidate, val के समान है, तो -
- ans वापस करें
बेहतर समझ के लिए निम्न कार्यान्वयन देखें -
उदाहरण
#include <bits/stdc++.h> using namespace std; class Solution { public: string nearestPalindromic(string n) { int sn = n.size(); if(sn == 1){ return string(1, --n[0]); } int half_sn = (sn+1)/2; long half_val = stol(n.substr(0, half_sn)); vector<long> candidates = {pow(10, sn)-1, pow(10, sn-1)-1, pow(10, sn-1)+1, pow(10, sn)+1}; vector <long> fmdc = {half_val, half_val-1,half_val+1}; for(long c:fmdc){ string rev = to_string(c); if(sn%2)rev.pop_back(); reverse(rev.begin(),rev.end()); candidates.push_back(stol(to_string(c) + rev)); } sort(candidates.begin(), candidates.end()); string ans; long val = stol(n), min_diff = INT_MAX; for(long candidate : candidates){ if(candidate == val)continue; long diff = labs(candidate - val); if(diff < min_diff){ min_diff = diff; ans = to_string(candidate); } } return ans; } }; main(){ Solution ob; cout << (ob.nearestPalindromic("145")); }इनपुट
“145”
आउटपुट
141