【发布时间】:2011-03-08 00:22:19
【问题描述】:
我正在尝试将整数作为参数,然后使用递归将整数中的每个数字加倍。
例如doubleDigit(3487) 将返回33448877。
我被困住了,因为我不知道如何读取我猜的数字中的每个数字。
【问题讨论】:
-
不确定为什么要为此使用递归......?
我正在尝试将整数作为参数,然后使用递归将整数中的每个数字加倍。
例如doubleDigit(3487) 将返回33448877。
我被困住了,因为我不知道如何读取我猜的数字中的每个数字。
【问题讨论】:
要使用递归执行此操作,请使用取模运算符 (%),每次除以 10 并向后累积结果字符串,直到达到基本情况 (0),这里没有什么可除的了。在基本情况下,您只需返回一个空字符串。
String doubleDigit(Integer digit) {
if (digit == 0) {
return "";
} else {
Integer thisDigit = digit % 10;
Integer remainingDigits = (digit - thisDigit) / 10;
return doubleDigit(remainingDigits) + thisDigit.toString() + thisDigit.toString();
}
}
【讨论】:
如果您正在寻找返回 long 而不是 String 的解决方案,您可以使用以下解决方案(与 Chris' 非常相似,假设 0 作为基本情况):
long doubleDigit(long amt) {
if (amt == 0) return 0;
return doubleDigit(amt / 10) * 100 + (amt % 10) * 10 + amt % 10;
}
功能当然受限于Java中的maximum size of a long。
【讨论】:
我在构建 Java 程序时也做了同样的问题。这是我的解决方案,它适用于负数和正数(并为 0 返回 0)。
public static int doubleDigits(int n) {
if (n == 0) {
return 0;
} else {
int lastDigit = n % 10;
return 100 * doubleDigits(n / 10) + 10 * lastDigit + lastDigit;
}
【讨论】:
这里不需要使用递归。
我不再是 java 人,但我可能使用的算法的近似值是这样的(在 C# 中工作,应该直接转换为 java):
int number = 3487;
int output = 0;
int shift = 1;
while (number > 0) {
int digit = number % 10; // get the least-significant digit
output += ((digit*10) + digit) * shift; // double it, shift it, add it to output
number /= 10; // move to the next digit
shift *= 100; // increase the amount we shift by two digits
}
这个解决方案应该可以工作,但是现在我已经麻烦了编写它,我意识到将数字转换为字符串并对其进行操作可能更清楚。当然,那会慢一些,但你几乎肯定不会在意这么小的速度差异 :)
编辑: 好的,所以你必须使用递归。你已经接受了一个完美的答案,但这是我的:)
private static long DoubleDigit(long input) {
if (input == 0) return 0; // don't recurse forever!
long digit = input % 10; // extract right-most digit
long doubled = (digit * 10) + digit; // "double" it
long remaining = input / 10; // extract the other digits
return doubled + 100*DoubleDigit(remaining); // recurse to get the result
}
请注意,我已切换到 long,因此它可以使用更多数字。
【讨论】:
您可以获得给定整数的String.valueOf(doubleDigit) 表示,然后使用 Commons StringUtils(在我看来是最简单的)来操作字符串。
如果您需要在该点返回另一个数值(与新创建/操作的字符串相反),您可以执行 Integer.valueOf(yourString) 或类似的操作。
【讨论】: