题目:
给你一个 32 位的有符号整数
x
,返回将x
中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围
[−231, 231 − 1]
,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1: 输入:x = 123 输出:321
示例 2: 输入:x = -123 输出:-321
代码如下:
// 整个算法主要是先取余,把余数当高位得到结果
// 但这里难理解的是如和判断是否在范围内
//在while 这个循环中,有一个if语句,判断conut的大小即判断翻转后的数值是否符合要求
//conut在最大数(最小数)的1/10就可以判断了,因为若count>INT_MAX,必定会溢出。
int reverse(int x){
int count = 0;
while(x != 0 )
{
if(count < INT_MIN/ 10 || count > INT_MAX / 10) //INT_MIN和INT_MAX在C/C++中是常量,表示最大和最小整数
{
return 0;
}
count = count * 10 + x % 10 ;
x = x / 10 ;
}
return count;
}
在这一题中,整个算法并不算太难想到,就是先取余再把余数当高位得到结果。
但我在这一题卡住的是,如何去判断这个数是否溢出了,如果溢出了要返回0。但后来我再仔细看这代码才发现,while循环中for语句的判断是——
if(count < INT_MIN/ 10 || count > INT_MAX / 10)
判断的是count的值,即翻转后的值,所以不必考虑翻转前的数是否会溢出。其实如果真的超过最大值了,根本就不会存到x中,不需要考虑这个问题。
所以,要考虑的是翻转后的count值是否会溢出。我们可以直接判断最大值(最小值)的1/10。比如说最大值(2147483647)到倒数第二位是4,当count最后一位大于4时,必定会溢出。而若是2147483642至2147483647这几个数翻转前就是溢出的数了,所以会直接pass掉,而2147483641这个数小于最大值,原本也符合条件,在If条件语句中也符合。
综上所述,if判断语句可以写为上面的式子。
自己也在写这个的时候把if语句中的判断语句彻底想明白了,耶!
<完>