最近我遇到了2个容易出问题的问题,可以在一小时内解决。我对竞争性编程并不熟悉,所以这对我来说并不容易,而且我只是采用蛮力方法,所以现在我感兴趣的是我的解决方案是否有效,如果有的话是更好的解决方案。
问题是:
给定N(2位或更多),找到最小数字,使其数字的乘积等于N.如果不可能,则返回0.
我在java中的解决方案看起来像这样
int getNumber(int N) {
int i = 25;
while(i < Integer.MAX_VALUE) {
if(digitsMult(i) == N)
return i;
i++;
}
return 0;
}
如果你能检查第二个问题也会很好。
给定N,返回X,这样
X&gt; N,X - 简单,X - 回文
这里我也使用蛮力
int getPrimePalindrome(int N) {
int i = N;
while(i < Integer.MAX_VALUE) {
if(isPalindrome(i))
if(isPrime(i))
return i;
i++;
}
return 0;
}
boolean isPalindrome(int n) {
String num = Integer.toString(n);
String reverse = new StringBuffer(n).reverse().toString();
return num.equals(reverse);
}
boolean isPrime(int n) {
if(n == 2)
return true;
if(n % 2 == 0)
return false;
for(int i = 3; i*i <= n; i+=2)
if(n % i == 0)
return false;
return true;
}
答案 0 :(得分:2)
这种问题在编码访谈中很常见。你提出的“暴力强迫”是唯一的方法,但是,我认为他们正在寻找的是聪明的优化,
例如,你的isPalindrome
可以更有效率 - 你只需要检查前半部分的匹配,而不是整个事情。
其次,你不想每次都在内循环内计算你的素数叠加。我会将isPrime
移动到外部if
,这将允许您维护完整的素数列表,而不必每次都计算它。