题目:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解答:
- 首先想到的是字符串反转,然后类型转换,效率不行
- 重点在于判断是否溢出,采用较长的数据类型来存储结果,下面采用的是long long,官方答案有更好的方法
- 注意最后判断使用的方法:判断强制类型转换为int后是否与原数据相等,如果相等则没有溢出
- while循环的判断条件:x!=0 因为x每次 /=10 最终肯定为0,这样不用判断数据是否为正负
注意:
写完代码后,需要找几个特殊输入进行测试,例如0 10 等情况,以减少代码bug。
int reverse(int x) { if (x<10 && x> -10)//只有一位的直接返回 { return x; } long long result = 0; while (x != 0) { result = result*10 + (x % 10); x /= 10; } return ((int)result ==result)? (int)result : 0; }
答案给的判断溢出:
while循环中,result = result *10 + x%10; 在这里判断
- result > MAX_INT/10,因为之后要*10再加上余数;
- 如果 result==MAX_INT/10,则判断 x%10 是否 > MAX_INT%10,即加上的数字是否刚好超过MAX_INT的最后一位,对于32bit的int,最后一位为7
- 如果 x < 0 按照类似的逻辑判断
- 采用 MAX_INT%10 MIN_INT%10可以不用记住末位的数字,而且后续也好扩展
- 上面采用long long 存储结果是取巧行为,如果要写成一个模板方法的话,直接不能用了,所以还是要分析细节