如何在Java

时间:2018-07-25 16:11:02

标签: java string

这是我要解决的问题。给定一个像6928这样的数字:

  • 6与9之间的差异是3
  • 9与2之间的差异是7
  • 2与8之间的差异是6

因此,简化形式为376。由于这不是两位数,所以我们重复此过程:

  • 3与7之间的差异是4
  • 7与6之差为1

结果是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;
}

1 个答案:

答案 0 :(得分:2)

来自comment

  

此代码正在运行,但我正在寻找对此更好的解决方案

这里是使用递归而不是String操纵的实现。

Pshemo said in a comment

  

尽量避免在整数和字符串之间进行转换。纯粹基于整数的解决方案并不难创建,并且有可能变得更快。要获取模数为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 % 108

对于整数数学,除以10将舍弃最后一位,例如6928 / 10692

首次通话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;