给你一个 32 位的有符号整数 x
,返回将 x
中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1]
,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
int reverse(int x) {
int result = 0;
while (x != 0) {
int digit = x % 10;
if (result > INT_MAX / 10 || (result == INT_MAX / 10 && digit > 7)) {
return 0;
}
if (result < INT_MIN / 10 || (result == INT_MIN / 10 && digit < -8)) {
return 0;
}
result = result * 10 + digit;
x = x / 10;
}
return result;
}
今天和大家分享一个我认为写的很好的一个写法,这是我用GPT搞出来的一个答案,大体向大家表达一下我个人的理解:
用dighit取数字的尾部,result这里相当于sum的意思,就是把每个数字反转后乘以对于的10的次数然后求和,就是最后的答案,result每次在循环中会进行更新,第一取到的尾数会随着result的不断更新最后成为次幂最大的那个数,其他数字也是类似,而x会随着循环不断更新变小,每次取一个尾数就除以一次十,最后当x为0时就说明已经全部取完,数字完成了反转。
这个方法不需要用数组,避免了使用额外的空间,我自己写的就是一大坨了,就不献丑了。
这道题最关键的一个点就是如何取判断所给的数字在反转之后是否超出了原来的范围,当x是一个以9结尾的数字,而且位数也达到了范围的边界,反转之后就会超出范围,这时就要返回0,这里用digit>7和digit<-8表示在达到边界的时候是否超出范围,也就是我上面说的情况,
这里的INT_MIN和INT_MAX是表示int范围的最大和最小,我们在编译器中要包含头文件#include<limits.h>