在 java 中使用字符串生成器反转数字

Reverse a number using String builder in java

问题陈述:给定一个 32 位有符号整数,反转整数的数字。

示例 1:

输入:123 输出:321 示例 2:

输入:-123 输出:-321

我的解决方案:

class Solution7{
public int reverse(int x) {
    if(x>Integer.MAX_VALUE || x<Integer.MIN_VALUE) {
        return 0;
    }


    StringBuilder S_rev = new StringBuilder();
    String S_r_v=S_rev.append(Math.abs(x)).reverse().toString();//.toString() String builder to String

   double reverse_no=Double.parseDouble(S_r_v);

    if (x < 0) {
        return -(int)reverse_no;
    }
    return (int)reverse_no;

}

}

我的解决方案适用于大多数测试用例。但是它无法通过一个测试用例,我得到了一个错误

Error第 10 行:java.lang.NumberFormatException:对于输入字符串:“8463847412-”

如果有人知道这是什么类型的错误,请讨论。

提前谢谢你。

通过将数字转换为 String 并反转符号结束于值的末尾。这会使号码无效。

您不必转换为 Stringdouble。您可以使用模块运算符 % 来提取数字:

public int reverse(int x) {
  long result = 0;
  while (x != 0) {
    result *= 10;
    result += x % 10;
    x /= 10;
  }
  if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE) {
    throw new IllegalArgumentException(); // overflow
  }
  return result;
}

您似乎在尝试传入 Integer.MIN_VALUE

当您传入最小整数值时,Math.abs 似乎 return 此处所述的负数

https://docs.oracle.com/javase/8/docs/api/java/lang/Math.html#abs-int-

 Note that if the argument is equal to the value of Integer.MIN_VALUE, the most negative representable int value, the result is that same value, which is negative.

如果 x 是 Integer.MIN_VALUE,您可以检查 x<=Integer.MIN_VALUE 和 return 0,或者处理 Integer.MIN_VALUE

的特殊情况
 if(x== Integer.MIN_VALUE)
      return -8463847412;

如果您一定要使用 StringBuilder 来实现它,这里是:

  public static void main(String[] args) {
    ReverseNum reverseNum = new ReverseNum();
    System.out.println(reverseNum.reverse(-123));
    System.out.println(reverseNum.reverse(123));
    System.out.println(reverseNum.reverse(0));
  }

  public int reverse(int x) {
    int res = 1;
    String xStr = String.valueOf(x);
    StringBuilder builder = null;

    if (xStr.startsWith("-")) {
      builder = new StringBuilder(xStr.substring(1));
      res = -1;
    } else {
      builder = new StringBuilder(xStr);
    }

    return res * Integer.valueOf(builder.reverse().toString());
  }

输出:

-321
321
0

P.S。如果你想避免整数溢出,那么你可以简单地使用 long 而不是 int,像这样:

  public long reverse(int x) {
    long res = 1;
    String xStr = String.valueOf(x);
    StringBuilder builder = null;

    if (xStr.startsWith("-")) {
      builder = new StringBuilder(xStr.substring(1));
      res = -1;
    } else {
      builder = new StringBuilder(xStr);
    }

    return res * Long.valueOf(builder.reverse().toString());
  }
public class ReverseString {
  public static void main(String args[]) {
    ReverseString rs = new ReverseString();
    System.out.println(rs.reverse(-84638));
    System.out.println(rs.reverse(5464867));
  }

  public long reverse(int number) {

    boolean isNegative = number < 0;

    StringBuilder reverseBuilder = new StringBuilder();
    String reversedString = reverseBuilder.append(Math.abs(number)).reverse().toString();
    long reversedStringValue = Long.parseLong(reversedString);

    if(isNegative) {
      return reversedStringValue * -1;
    } else {
      return reversedStringValue;
    }
  }
}

此代码提供了您在需求中提到的输出。并且它还支持整数溢出。您的要求是转换 int 值。因为转换值可能不在 int 范围内,所以以更高格式获取转换值是可以的。我已将反向方法 return 类型更改为 long.

我发现您的代码中存在一些问题。

public int reverse(int x) {
if(x>Integer.MAX_VALUE || x<Integer.MIN_VALUE) {
    return 0;
}

上面的代码段,不是检查值是否在 int 范围内的重点,因为它已经作为字符串接收到参数中。它应该在执行代码行之前抛出错误,因为它无法将较大的值放入 int 变量。

最后,您使用的int数不在int范围内。 (-8463847412)

这个呢?

public class ReverseNumber {
    public static void main(String[] args) {
        System.out.println(reverse(123456));
        System.out.println(reverse(0));
        System.out.println(reverse(-987654));
    }

    private static int reverse(int i) {
        final int signum;
        if(i < 0) {
            signum = -1;
        } else {
            signum = +1;
        }

        int reversedNumber = 0;
        int current = Math.abs(i);

        while(0 < current) {
            final int cipher = current % 10;

            reversedNumber = Math.addExact(Math.multiplyExact(reversedNumber, 10), cipher);
            current = current / 10;
        }

        return signum * reversedNumber;
    }
}

输出:

654321
0
-456789

这个解决方案避免了字符串并且可以处理负数。 如果发生整数溢出,它会抛出算术异常。