到目前为止,这就是我所能想到的。
public static int evens(int n)
{
String num = "" + n;
if (n>1) {
if (n%2 == 0) {
return n + evens(n%10);
}
else {
int len = num.length();
num = num.substring(0, len-1);
n = Integer.parseInt(num);
return n + evens(n%10);
}
}
else {
return n;
}
}我的逻辑是将整数设为字符串,然后每一次除以10,使下一个数字(从右到左)位于1的位置(使用整数,我相信应该删除前一个数字)。然后,我尝试使用%2来查找剩余部分,如果不是==0,则1位置中的数字是奇怪的,并以某种方式从字符串中删除该数字(方法是取长度,然后从0到len-1取一个子字符串)。我认为我的问题可能包括逻辑,显然,我的语法有问题,定义字符串的方法的第一行会导致它通过每次递归重新定义,从而使它变得混乱。
发布于 2015-10-22 20:23:50
紧凑的非字符串版本:
public static int evenDigits(int n) {
return (n&1) != 0 ? evenDigits1(n/10) : n < 10 ? n : n%10 + evenDigits(n/10)*10;
}解释:
public static int evenDigits(int n) {
if ((n & 1) != 0) {
// Last digit is odd, so remove it. Recurse on higher digits
return evenDigits(n / 10);
}
if (n < 10) {
// Single digit number is even, so we're done
return n;
}
// Keep last digit (it is even). Recurse on higher digits
return n % 10 + evenDigits(n / 10) * 10;
}发布于 2015-10-22 19:40:48
的确,有几个but主要是由冗余逻辑引起的,但它可以很容易地得到(简化和)修复:
public static String evenDigits(int n)
{
if (n > 0) {
if (n % 2 == 0) {
return n % 10 + "" + evenDigits(n / 10);
} else {
return evenDigits(n / 10) + "";
}
} else {
return "";
}
}请特别注意返回语句中参数的“切换”:
return n + evenDigits(n%10);至:
return n % 10 + "" + evenDigits(n / 10);通过返回n % 10,您将返回您正在处理的当前数字(这正是您想要的),并使用n / 10递归地发送该数字的"rest“。
一种不同的方法可以是,根本不使用String。将它与迭代方法(相对于上面建议的递归方法)结合起来,结果如下所示:
public static int evenDigits(int n) {
int res = 0;
int mag = 0;
while (n > 9) {
int digit = n % 10;
n /= 10;
if (digit % 2 == 0) {
res += Math.pow(10, mag) * digit;
mag++;
}
}
return res;
}https://stackoverflow.com/questions/33289212
复制相似问题