我正在尝试下面的挑战。 https://www.hackerrank.com/contests/projecteuler/challenges/euler145/submissions/code/25262675如何让此代码更高效? Java算法
基本上,代码需要反转大约1-19位数字的不同长度,将这些数字相加在一起,然后检查结果是否完全由奇数组成,前导0是不允许的(例如100应该被排除)。
我已经完善的代码可以计算出这些数字,但是在网站上有一个超时时间,我觉得它的性能不够好。
我试过使用正则表达式,但无法得到它正确排序,它影响结果。任何指导都是最好的方式来编写它,以便它尽可能快地运行,这将非常有用,如果它需要使用正则表达式或其他任何东西。
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
long t = scan.nextInt(); //Number of numbers to test
for (int i = 1; i <= t; i++){
long n = scan.nextLong();
calc(n); //begins calculation
}
}
public static void calc(long n)
{
long reversible = 0; //Counter
for (long i = 1; i < n; i++)
{
if (i%10 != 0) //Makes sure number does not end with a zero
{
long reverse = 0;
long j = i;
long checkOdd;
//Reverse the number
while(j != 0)
{
reverse = reverse * 10;
reverse = reverse + j%10;
j = j/10; //
}
long result = i + reverse; //Add current number and reverse
while (result != 0)
{
//Check and remove numbers to see if odd or not
checkOdd = result%10;
if (checkOdd%2 == 0){ //Even detected, move to next number
result = 0;
}
result = result/10; //Move to next digit
//Counts and ensures we do not count the same number multiple times
if (checkOdd%2 == 1 && result == 0)
{
reversible = reversible + 1;
}
}
/** REGEX TEST CODE -- fails when result is 5 digits long after testing */
/** if(Pattern.matches("\\d[^02468]", Long.toString(result)))
{
System.out.println(result);
reversible = reversible + 1;
}*/
}
}
System.out.println(reversible);
}
(有了欧拉项目,_brute force_失败的经常会发生) – greybeard
那么你有什么建议,找出一个方程来计算它呢? –
这个问题看起来更适合http://codereview.stackexchange.com/ – jaco0646