মান লিইয়ে নিই একটি সংখ্যা n রয়েছে, আমাদের সেই সংখ্যার নিকটতম প্যালিনড্রোম সংখ্যা বের করতে হবে। প্যালিনড্রোম সংখ্যাটি দেওয়া সংখ্যা থেকে ছোট বা বড় হতে পারে, যেটির পরম পার্থক্য সবচেয়ে কম। সুতরাং যদি সংখ্যা 145 হয়, তবে ফলাফল হবে 141।
समाधान पद्धति
इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:
- sn := n-এর আকার
- যদি sn, 1-এর সমান হয়, তবে:
- n[0] 1 কমিয়ে n[0] দৈর্ঘ্যের 1 দিয়ে স্ট্রিং ফেরত দিন
- half_sn := (sn + 1) / 2
- half_val := n-এর 0 থেকে half_sn ইনডেক্স পর্যন্ত সাবস্ট্রিং-এর long ভ্যালু
- 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 সরণিটি রিভার্স করুন
- c কে candidates-এ যোগ করুন
- 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