问题

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

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

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。

解决

Java解决方案
安照正常的思考,我们的代码如下:

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

当输入1245678993 输出了-296201875 细心的人就会发现,此时栈溢出了;

原因是多乘了一次10,解决办法就是,先判断是否已经栈溢出,再进行乘以10

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

C语言解决方案
和java一样,先判断是否越界,再进行反转操作,这里我们需要引入头文件"limits.h"

int reverse(int x) 
{
	int temp = 0;
	while (x != 0)
	{
		//正数是否越界
		if (temp > 0 && ((temp == INT_MAX / 10 && x % 10 > INT_MAX % 10) || temp > INT_MAX / 10))
			return 0;

		//负数是否越界
		if (temp < 0 && ((temp == INT_MIN / 10 && x % 10 < (unsigned)INT_MIN % 10) || temp < INT_MIN / 10))
			return 0;
		temp = temp * 10 + x % 10;
		x /= 10;
	}
	return temp;
}