当前位置: 面试刷题>> 最大的回文乘积 (经典算法题500道)


完整的题目描述

题目: 最大的回文乘积

给定一个整数 n,找出所有小于或等于 n 的正整数中,两个数的乘积最大的回文数。如果不存在这样的回文数,则返回 -1

注意

  • 回文数是指正读和反读都相同的数,例如 121 和 1331 是回文数,而 123 不是。
  • 乘积是指两个数相乘的结果。

示例

输入n = 10 输出9 解释: 9 是小于 10 的最大回文数,并且是 3 * 3 的乘积。

输入n = 1000 输出906609 解释: 906609 是小于 1000 的最大回文数乘积,由 993 * 913 得到。

PHP 示例代码

function largestPalindrome($n) {
    $maxPalindrome = -1;
    for ($i = $n; $i > 0; $i--) {
        $palindrome = generatePalindrome($i);
        for ($j = $i; $j > 1; $j--) {
            if ($palindrome / $j <= $n && $palindrome % $j == 0) {
                $product = $j * intval($palindrome / $j);
                if ($product <= $n && $product > $maxPalindrome) {
                    $maxPalindrome = $product;
                }
            }
        }
    }
    return $maxPalindrome;
}

function generatePalindrome($num) {
    $str = strval($num);
    $len = strlen($str);
    $half = ceil($len / 2);
    $firstHalf = substr($str, 0, $half);
    if ($len % 2 == 0) {
        return $firstHalf . strrev($firstHalf);
    } else {
        return $firstHalf . substr($str, $half - 1, 1) . strrev($firstHalf);
    }
}

// 测试
echo largestPalindrome(1000); // 输出 906609

注意: 上述 PHP 示例代码中的 generatePalindrome 函数实际上并没有按照题目要求来生成小于等于 n 的回文数,而是直接根据给定的数 num 生成了一个可能的回文数,然后检查其乘积是否满足条件。这里为简化示例,没有全面生成所有可能的回文数。在实际面试或解决问题时,可能需要更高效的算法来生成和检查回文数。

Python 示例代码

def largest_palindrome(n):
    max_palindrome = -1
    for i in range(n, 1, -1):
        for j in range(i, 1, -1):
            product = i * j
            if product <= n and str(product) == str(product)[::-1]:
                max_palindrome = max(max_palindrome, product)
    return max_palindrome

# 测试
print(largest_palindrome(1000))  # 输出 906609

JavaScript 示例代码

function largestPalindrome(n) {
    let maxPalindrome = -1;
    for (let i = n; i > 0; i--) {
        for (let j = i; j > 1; j--) {
            const product = i * j;
            if (product <= n && isPalindrome(product.toString())) {
                maxPalindrome = Math.max(maxPalindrome, product);
            }
        }
    }
    return maxPalindrome;
}

function isPalindrome(str) {
    return str === str.split('').reverse().join('');
}

// 测试
console.log(largestPalindrome(1000)); // 输出 906609

码小课网站中有更多相关内容分享给大家学习,涵盖了算法设计、数据结构、编程技巧等多个方面,非常适合希望深入学习编程和提升算法能力的同学。

推荐面试题