[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

本文转自博客园Grandyang的博客,原文链接:[LeetCode] Largest Palindrome Product 最大回文串乘积

,如需转载请自行联系原博主。

时间: 2024-10-08 05:23:15

[LeetCode] Largest Palindrome Product 最大回文串乘积的相关文章

[LeetCode] Valid Palindrome II 验证回文字符串之二

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome. Example 1: Input: "aba" Output: True Example 2: Input: "abca" Output: True Explanation: You could delete the character 'c'. N

LeetCode 9 Palindrome Number (回文数)

翻译 确定一个整数是否是回文数.不能使用额外的空间. 一些提示: 负数能不能是回文数呢?(比如,-1) 如果你想将整数转换成字符串,但要注意限制使用额外的空间. 你也可以考虑翻转一个整数. 然而,如果你已经解决了问题"翻转整数(译者注:LeetCode 第七题), 那么你应该知道翻转的整数可能会造成溢出. 你将如何处理这种情况? 这是一个解决该问题更通用的方法. 原文 Determine whether an integer is a palindrome. Do this without ex

[经典面试题]回文串专题

[小米]2015小米校招之回文数判断 [百度]2014百度校园招聘之最长回文串 [网易]字符串回文分割 [创新工场]2014创新工场校园招聘之回文串修复 [算法]Manacher算法之最大回文子串 [LeetCode]9.Palindrome Number [LeetCode]125.Valid Palindrome [LeetCode]131.Palindrome Partitioning [LeetCode]132.Palindrome Partitioning II

Java实现查找当前字符串最大回文串代码分享_java

先看代码 public class MaxHuiWen { public static void main(String[] args) { // TODO Auto-generated method stub String s = "abb"; MaxHuiWen(s); } //1.输出回文串 public static void MaxHuiWen(String s){ //存储字符串的长度 int length = s.length(); //存储最长的回文串 String M

HDOJ/HDU 2163 Palindromes(判断回文串~)

Problem Description Write a program to determine whether a word is a palindrome. A palindrome is a sequence of characters that is identical to the string when the characters are placed in reverse order. For example, the following strings are palindro

算法:uva 11404 Palindromic Subsequence(LCS回文串,最小字典序)

题目大意 给一个字符串,输出它的最长回文串,如果有多个结果,输出字典序最小的. 思 路 我们都知道把一个字符串逆序后和原字符串进最长公共子序列,可以计算出它的最长回文串长度. 但是这题不仅要输出回文串,而且还要求是字典序最小的,所以挺难搞的. 设str1是正序字符串, str2是逆序后的字符串 f[i][j].len 表示str1的前i位,str2的前j位,最长公共子串的长度 f[i] [j].str 表示str1的前i位,str2的前j位,最长公共子串的最小字典序的字符串 状态转移和正常的LC

代码审查-最大回文串问题,拜托各位了

问题描述 最大回文串问题,拜托各位了 我找很长时间了,就是找不到错误(可以编译,输出不对),拜托各位看一下,新人,没有悬赏分,感谢各位的回答 #include<iostream> #include<string.h> #include<cctype> using namespace std; int main() { char a[101], b[101]; int c[101]; while (cin.getline(a, 101)) { int i,d, k, x,

[百度]2014百度校园招聘之最长回文串

[题目] 给你一个字符串,找出该字符串中对称的子字符串的最大长度.即求最大回文串. [思路1]暴力法 即不使用技巧,穷举所有可能.时间复杂度为O(n^3)(时间上最长,不推荐使用),空间复杂度为O(1). 本思路是从最大长度的字串开始,而不是从最小开始.假如说给定的字符串为len,先遍历长度为len的字串是否为回文串,如果是停止, 如果不是遍历长度为len-1的字串是否是回文串,一次类推. #include <iostream> using namespace std; //是否是回文串 bo

NYOJ 1023 还是回文(DP,花最少费用形成回文串)

/* 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 那么,将字符串变成回文串的最小花费是多少呢? 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字符串中删除这个字符 x 同样也能形成回文串! 所以我们只记录删除,和增加这个字符 x 的最小的费用就好了!->转变成添加多少个字符形成回文串费用最少! str[i]!=str[k] dp[i][j]=min(dp[i][j-1]+cost[str[k]-'a'], dp[i+1][j-1]+cost