邓心一 6 gadi atpakaļ
vecāks
revīzija
35579cccbb

+ 39 - 0
hard/479.largest-palindrome-product.go

@@ -0,0 +1,39 @@
+func largestPalindrome(n int) int {
+	// mod 1337
+	if n == 1 {
+		return 9
+	}
+	upper := int(math.Pow10(n)) - 1
+	lower := upper / 10
+	for i := upper; lower < i; i-- {
+		pa := toPalindrome(i)
+		bound := int(math.Sqrt(float64(pa)))
+		for j := upper; j >= bound; j-- {
+			if pa%j != 0 {
+				continue
+			}
+			if ratio := pa / j; lower < ratio && ratio <= upper {
+				return pa % 1337
+			}
+		}
+	}
+	return -1 // Not found
+}
+
+func toPalindrome(x int) (res int) {
+	num := make([]int, 64)
+	lo, hi := 0, 0
+	for ; x != 0; x /= 10 {
+		num[lo] = x % 10
+		lo++
+	}
+	copy(num[lo:], num[:lo])
+	for hi, lo = lo, lo-1; 0 <= lo; lo, hi = lo-1, hi+1 {
+		num[lo] = num[hi]
+	}
+	for i, base := 0, 1; i < hi; i, base = i+1, base*10 {
+		res += num[i] * base
+	}
+	return
+}
+

+ 36 - 0
hard/479.largest-palindrome-product.java

@@ -0,0 +1,36 @@
+class Solution {
+    private static final int MOD = 1337;
+
+    public int largestPalindrome(int n) {
+        if (n == 1) return 9;
+        int upper = (int) Math.pow(10, n) - 1;
+        int lower = upper / 10;
+        for (int i = upper; lower < i; i--) {
+            long p = toPalindrome(i, n);
+            int sqrt = (int) Math.sqrt(p);
+            for (int j = upper; sqrt <= j; j--) {
+                if (p % j != 0L) continue;
+                int ratio = (int) (p / j);
+                if (lower < ratio && ratio <= upper)
+                    return (int) (p % MOD);
+            }
+        }
+        return -1;
+    }
+
+    private long toPalindrome(int num, int n) {
+        int[] digits = new int[2 * n];
+        for (int hi = n, lo = n - 1; 0 <= lo; hi++, lo--) {
+            int digit = num % 10;
+            digits[hi] = digit;
+            digits[lo] = digit;
+            num /= 10;
+        }
+        long p = 0L, base = 1L;
+        for (int i = 0; i < 2 * n; i++) {
+            p += digits[i] * base;
+            base *= 10L;
+        }
+        return p;
+    }
+}