From 765b40ad712ac6b28c77aab16fa7692aaa2849fd Mon Sep 17 00:00:00 2001 From: Matej Focko Date: Sun, 25 Aug 2024 14:05:50 +0200 Subject: [PATCH] =?UTF-8?q?cs:=20add=20=C2=AB564.=20Find=20the=20Closest?= =?UTF-8?q?=20Palindrome=C2=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Matej Focko --- cs/find-the-closest-palindrome.cs | 56 +++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 cs/find-the-closest-palindrome.cs diff --git a/cs/find-the-closest-palindrome.cs b/cs/find-the-closest-palindrome.cs new file mode 100644 index 0000000..d6d3f6f --- /dev/null +++ b/cs/find-the-closest-palindrome.cs @@ -0,0 +1,56 @@ +public class Solution { + private static long MakePalindrome(long num) { + var s = num.ToString(); + var length = s.Length; + + var digits = s.ToArray(); + for (int l = (length - 1) / 2, r = length / 2; l >= 0; --l, ++r) { + digits[r] = digits[l]; + } + + return long.Parse(new string(digits)); + } + + private static long FindPalindrome( + long left, + long right, + Func update + ) { + var ans = long.MinValue; + + bool foundAnswer; + while (left <= right) { + var mid = left + (right - left) / 2; + var found = MakePalindrome(mid); + + (foundAnswer, left, right) = update(left, right, found, mid); + if (foundAnswer) { + ans = found; + } + } + + return ans; + } + + public string NearestPalindromic(string n) { + var number = long.Parse(n); + + var prev = FindPalindrome(0, number, (long left, long right, long found, long mid) => { + if (found < number) { + return (true, mid + 1, right); + } + return (false, left, mid - 1); + }); + var next = FindPalindrome(number, (long)1e18, (long left, long right, long found, long mid) => { + if (found > number) { + return (true, left, mid - 1); + } + return (false, mid + 1, right); + }); + + if (Math.Abs(prev - number) <= Math.Abs(next - number)) { + return prev.ToString(); + } + return next.ToString(); + } +}