以下是我要解决的problem。
编写一个接受整数参数n的方法evenDigits 返回通过从n中删除奇数位形成的整数。该 下表显示了几个调用及其预期的返回值:
Call Valued Returned
evenDigits(8342116); 8426
evenDigits(4109); 40
evenDigits(8); 8
evenDigits(-34512); -42
evenDigits(-163505); -60
evenDigits(3052); 2
evenDigits(7010496); 46
evenDigits(35179); 0
evenDigits(5307); 0
evenDigits(7); 0
如果向方法传递了偶数为0的偶数的负数,则结果也应为负数,如上所示,当传递-34512时。
结果中的前导零应该被忽略,如果数字中没有0以外的偶数,则该方法应该返回0,如最后三个输出所示。
到目前为止,我有这个 -
public static int evenDigits(int n) {
if (n != 0) {
int new_x = 0;
int temp = 0;
String subS = "";
String x_str = Integer.toString(n);
if (x_str.substring(0, 1).equals("-")) {
temp = Integer.parseInt(x_str.substring(0, 2));
subS = x_str.substring(2);
} else {
temp = Integer.parseInt(x_str.substring(0, 1));
subS = x_str.substring(1);
}
if (subS.length() != 0) {
new_x = Integer.parseInt(x_str.substring(1));
}
if (temp % 2 == 0) {
return Integer.parseInt((Integer.toString(temp) + evenDigits(new_x)));
} else {
return evenDigits(new_x);
}
}
return 0;
}
答案 0 :(得分:2)
为什么人们似乎总是希望转换为String
来处理数字? Java具有完美的算术原语来处理作业。例如:
public static int evenDigits(int n) {
int rev = 0;
int digitCount = 0;
// handle negative arguments
if (n < 0) return -evenDigits(-n);
// Extract the even digits to variable rev
while (n != 0) {
if (n % 2 == 0) {
rev = rev * 10 + n % 10;
digitCount += 1;
}
n /= 10;
}
// The digits were extracted in reverse order; reverse them again
while (digitCount > 0) {
n = n * 10 + rev % 10;
rev /= 10;
digitCount -= 1;
}
// The result is in n
return n;
}
虽然对于像这样的简单学术练习没有任何区别,但是通过算术单独处理工作可能比任何涉及转换为String
的工作都要好。
答案 1 :(得分:2)
通常使用递归解决方案更容易,然后再回到迭代(如果必须):
public static int evenDigits(int n) {
if (n < 0) {
return -evenDigits(-n);
} else if (n == 0) {
return 0;
} else if (n % 2 == 1) {
return evenDigits(n / 10);
} else {
return 10 * evenDigits(n / 10) + (n % 10);
}
}
答案 2 :(得分:0)
int n = 8342116;
StringBuilder sb = new StringBuilder();
Integer.toString(n).chars()
.filter(x -> x % 2 == 0)
.mapToObj(i -> (char) i)
.forEachOrdered(sb::append);
int result = Integer.valueOf(sb.toString());
System.out.println(result); // 8426
答案 3 :(得分:0)
public int evenDigits(int n) {
int r = 0;
boolean neg = false;
String evenDigits = "";
if (n < 0) { neg = true; n = abs(n); }
// keep dividing n until n = 0
while (n > 0) {
r = n % 10;
n = n / 10; // int division
if (r % 2 == 0) { evenDigits = Integer.toString(r) + evenDigits; }
}
int result = Integer.parseInt(evenDigits);
if (neg) { result -= 2 * result; }
return result;
}
这或多或少是伪代码,但我认为你理解了我的想法。我之前使用过这个方法来解决同样的问题。
答案 4 :(得分:0)
基于String
s:
public static int evenDigits(int n) {
StringBuilder evenDigitsBuffer = new StringBuilder();
for (char digitChar : String.valueOf(n).toCharArray()) {
int digit = Character.getNumericValue(digitChar);
if (digit % 2 == 0) {
evenDigitsBuffer.append(digit);
}
}
return evenDigitsBuffer.length() > 0
? Integer.signum(n) * Integer.parseInt(evenDigitsBuffer.toString())
: 0;
}