[LeetCode] Largest Palindrome Product 最大回文串乘積


 

Find the largest palindrome made from the product of two n-digit numbers.

Since the result could be very large, you should return the largest palindrome mod 1337.

Example:

Input: 2

Output: 987

Explanation: 99 x 91 = 9009, 9009 % 1337 = 987

 

Note:

The range of n is [1,8].

 

這道題給我們一個數字n,問兩個n位數的乘積組成的最大回文數是多少,返回的結果對1337取余。博主剛開始用暴力搜索做,遍歷所有的數字組合,求乘積,再來判斷是否是回文數,最終TLE了,只能換一種思路來做。論壇上的這種思路真心叼啊,博主感覺這題絕比不該Easy啊。首先我們還是要確定出n位數的范圍,最大值upper,可以取到,最小值lower,不能取到。然后我們遍歷這區間的所有數字,對於每個遍歷到的數字,我們用當前數字當作回文數的前半段,將其翻轉一下拼接到后面,此時組成一個回文數,這里用到了一個規律,當n>1時,兩個n位數乘積的最大回文數一定是2n位的。下面我們就要來驗證這個回文數能否由兩個n位數相乘的來,我們還是遍歷區間中的數,從upper開始遍歷,但此時結束位置不是lower,而是當前數的平方大於回文數,因為我們遍歷的是相乘得到回文數的兩個數中的較大數,一旦超過這個范圍,就變成較小數了,就重復計算了。比如對於回文數9009,其是由99和91組成的,其較大數的范圍是[99,95],所以當遍歷到94時,另一個數至少需要是95,而這種情況在之前已經驗證過了。當回文數能整除較大數時,說明是成立的,直接對1337取余返回即可,參見代碼如下:

 

class Solution {
public:
    int largestPalindrome(int n) {
        int upper = pow(10, n) - 1, lower = upper / 10;
        for (int i = upper; i > lower; --i) {
            string t = to_string(i);
            long p = stol(t + string(t.rbegin(), t.rend()));
            for (long j = upper; j * j > p; --j) {
                if (p % j == 0) return p % 1337;
            }
        }
        return 9;
    }
};

 

參考資料:

https://discuss.leetcode.com/topic/74372/an-easy-9-line-java-solution

https://discuss.leetcode.com/topic/74125/java-solution-using-assumed-max-palindrom

 

LeetCode All in One 題目講解匯總(持續更新中...)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM