java - 从两个三位数的乘积中优化最大的回文数?

标签 java algorithm optimization palindrome

我正在研究一个面试问题,我被问到这个问题,我应该编写一个程序来从两个三位数的乘积中找到最大的回文。

这是 question

我想出了这种从底部开始的蛮力方法。

public class LargestPalindromeQuestion {

    public static void main(String[] args) {
        int value = 0;
        for (int i = 100; i <= 999; i++) {
            for (int j = i; j <= 999; j++) {
                int value1 = i * j;
                if (isPalindrome(value1) && value < value1) {
                    value = value1;
                }
            }
        }
        System.out.println(value);
    }

    private static boolean isPalindrome(final int product) {
        int p = product;
        int reverse = 0;
        while (p != 0) {
            reverse *= 10;
            reverse += p % 10;
            p /= 10;
        }
        return reverse == product;
    }
}

他们问我这个程序可以做哪些优化?我提到我们可以尝试修剪搜索空间并优化搜索空间中每个项目的检查步骤,但我很困惑如何在我的上述解决方案中实现这项工作?

我们可以在这个程序中做哪些优化?现在它正在执行 810000 步来寻找最大的回文。

要找到两个三位数中最大的回文,我们最少可以执行多少步?

最佳答案

我觉得这个程序非常好。我将使 i 循环计数从 999 下降到 100,并且我只会检查 j 值实际上给出了比当前最大值更大的产品。

这个程序能够很快完成,准确地说是 i == 952。这样做的数学原因是,一旦找到解决方案 906609 (993 * 913),将不再可能找到较大因子较小的较大回文比 906609 的平方根,即 952.160...

public static void main(String[] args) {
    int value = 0;
    for (int i = 999; i >= 100; i--) {
        int r = value / i;
        if (r >= i) {
            System.out.println("We broke at i = " + i);
            break;
        }
        for (int j = i; j > r; j--) {
            int value1 = i * j;
            if (isPalindrome(value1)) {
                value = value1;
                break;
            }
        }
    }
    System.out.println(value);
}

关于java - 从两个三位数的乘积中优化最大的回文数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29932870/

相关文章:

java - 如何使用单独的 jar 覆盖类?

java - 从servlet中的service方法调用init()方法

python - 最大子图

算法:挑选 n 个不同重量的元素以获得平均元素重量

database - 索引许多文档以启用支持 AND/OR 操作的查询

Mysql查询优化,搜索记录!

java - 你能让一个图像按钮像android中的位图一样移动吗

c - 包含给定集合中的所有字符串作为子字符串的最佳字符串

MySQL ORDER BY 范围优化

java - 无法从 List<Node> 转换为 List<Element>