【发布时间】:2015-04-29 01:34:37
【问题描述】:
我正在处理一个面试问题,有人问我,我应该编写一个程序来从两个三位数的乘积中找到最大的回文。
这里是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 步骤来寻找最大的回文。
我们可以执行的最少步数是多少,才能在两个三位数中找到最大的回文数?
【问题讨论】:
-
这可能会有所帮助(我正在解决同样的问题,所以我还没有阅读)mathblog.dk/project-euler-problem-4
-
假设前导零不允许作为回文的一部分,任何以零结尾的数字都不能是回文。因此,您可以跳过 i % 10 == 0 或 j % 10 == 0 的所有 i 和 j 值,因为乘以以 0 结尾的值会得到以 0 结尾的结果。
标签: java algorithm optimization palindrome