LeetCode7整数反转——(Java)两种方法

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1: 输入: 123 输出: 321
示例 2: 输入: -123 输出: -321
示例 3: 输入: 120 输出:21
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31 ^,231 −1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

  • 主要是解决溢出问题,这是我考虑不周到的地方: 解决溢出问题有两个思路:
  • 第一个思路是通过字符串转换加try~catch的方式来解决;
  • 第二个思路就是通过数学计算来解决。

第一种方法(自己第一次做的思路):
(1)考虑为0情况:如果x=0,直接返回0
(2)x>0,则布尔型变量flag=true;x<0,则flag为false;
(3)为了更方便,记录了flag之后,取x的绝对值;
(4)将数字拆分,依次加入动态数组;
(5)考虑到反转之后,前面如果有一个或多个为0的,则需要去0;
(6)当前面没有0之后,就继续将数组中的数字取出来,以String的形式,后面转为int型即可。
(7)捕获异常:反转后整数溢出要返回 0;
(8)最后判断flag,决定返回的d是正还是负。

public int reverse(int x) {
    
    
	// 判断正负
	if (x == 0) {
    
    
		return 0;
	}
	boolean flag = false;
	if (x > 0) {
    
    
		flag = true;
	}
	x = Math.abs(x);
	int d = 0;// 返回
	// 判断几位数,加入数组
	ArrayList<Integer> list = new ArrayList<>();
	while (x != 0) {
    
    
		int a = x % 10;
		list.add(a);
		x /= 10;
	}
	String string = new String();
	int count = 0;
	OUT: for (int i = 0; i < list.size(); i++) {
    
    
		if (list.get(i) == 0) {
    
    
			count++;
			continue;
		}
		for (int j = count; j < list.size(); j++) {
    
    
			string += list.get(j);
		}
		break OUT;
	}
	try {
    
    
		if (Integer.parseInt(string) > Integer.MAX_VALUE) {
    
    
			return 0;
		} else {
    
    
			d = Integer.parseInt(string);
		}
	} catch (Exception e) {
    
    
		return 0;
	}
	if (!flag) {
    
    
		d = -d;
	}
	return d;
}

第二种方法:
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出

class Solution {
    
    
   public int reverse(int x) {
    
    
      long temp = 0;
      while(x != 0){
    
    
          int pop = x % 10;
          temp = temp * 10 + pop;
          if(temp > Integer.MAX_VALUE || temp < Integer.MIN_VALUE){
    
    
              return 0;
          }
          x /= 10;
      }
      return (int)temp;
  }
}

end.

猜你喜欢

转载自blog.csdn.net/weixin_44998686/article/details/108485070
今日推荐