这是我要解决的问题。给定一个像6928这样的数字:
因此,简化形式为376。由于这不是两位数,所以我们重复此过程:
结果是41(这是一个两位数字)和解决方案。
这是我的尝试:
public int twodigit(int inp){
String val = "";
String s = Integer.toString(inp);
while(s.length() > 2) {
s = strfind(s);
}
int n = integer.parseInt(s);
return n;
}
public String strfind(String s) {
int len = s.length();
String mynew = "";
for(int i = 0; i < len - 1; i++) {
char a = s.charAt(i);
char b = s.charAt(i+1);
int x = Integer.parseInt(String.valueOf(a));
int y = Integer.parseInt(String.valueOf(b));
int dif = Math.abs(x-y);
String ad = Integer.toString(diff);
mynew = mynew + ad;
}
s = mynew;
return s;
}
答案 0 :(得分:2)
来自comment:
此代码正在运行,但我正在寻找对此更好的解决方案
这里是使用递归而不是String
操纵的实现。
尽量避免在整数和字符串之间进行转换。纯粹基于整数的解决方案并不难创建,并且有可能变得更快。要获取模数为10的数字的最后一位数字(例如
number%10
),请删除最后一位数字除以10(number = number / 10;
)。
public static int twodigit(int value) {
while (value > 99)
value = reduce(value);
return value;
}
private static int reduce(int value) {
return (value <= 9 ? 0 : reduce(value / 10) * 10 + Math.abs(value / 10 % 10 - value % 10));
}
测试
System.out.println(twodigit(6928));
输出
41
更新 reduce()
方法的解释,即以下语句:
return (value <= 9 ? 0 : reduce(value / 10) * 10 + Math.abs(value / 10 % 10 - value % 10));
也可以写成:
if (value <= 9)
return 0;
int lastDigit = value % 10;
int higherDigits = value / 10;
int secondLastDigit = higherDigits % 10;
int difference = Math.abs(secondLastDigit - lastDigit);
int higherReduced = reduce(higherDigits); // recursive call
int result = higherReduced * 10 + difference;
return result;
计算模数10将返回数字的最后一位,例如6928 % 10
是8
。
对于整数数学,除以10将舍弃最后一位,例如6928 / 10
是692
。
首次通话reduce(6928)
:
lastDigit = 6928 % 10 = 8
higherDigits = 6928 / 10 = 692
secondLastDigit = 692 % 10 = 2
difference = Math.abs(2 - 8) = 6
higherReduced = reduce(692) = 37 // see next
result = 37 * 10 + 6 = 376
递归调用reduce(692)
:
lastDigit = 692 % 10 = 2
higherDigits = 692 / 10 = 69
secondLastDigit = 69 % 10 = 9
difference = Math.abs(9 - 2) = 7
higherReduced = reduce(69) = 3 // see next
result = 3 * 10 + 7 = 37
递归调用reduce(69)
:
lastDigit = 69 % 10 = 9
higherDigits = 69 / 10 = 6
secondLastDigit = 6 % 10 = 6
difference = Math.abs(6 - 9) = 3
higherReduced = reduce(6) = 0 // see next
result = 0 * 10 + 3 = 3
递归调用reduce(6)
:
if (value <= 9)
return 0;