【发布时间】:2021-01-25 14:19:46
【问题描述】:
问题陈述:
给定一个 32 位有符号整数,反转整数位。
注意:假设我们正在处理的环境只能存储 32 位有符号整数范围内的整数:[ -2^31, 2^31 - 1]。为了 这个问题的目的,假设你的函数返回 0 时 反转整数溢出。
我正在尝试实现递归函数 reverseRec(),它适用于较小的值,但对于边缘情况来说是一团糟。
int reverseRec(int x)
{
if(abs(x)<=9)
{
return x;
}
else
{
return reverseRec(x/10) + ((x%10)*(pow(10, (floor(log10(abs(x)))))));
}
}
我已经实现了运行良好的非递归函数:
int reverse(int x)
{
long long val = 0;
do{
val = val*10 + (x%10);
x /= 10;
}while(x);
return (val < INT_MIN || val > INT_MAX) ? 0 : val;
}
这里我使用 long long 类型的变量 val 来检查 MAX 和 MIN 的签名 int 类型的结果,但描述问题特别提到我们需要在 32 位整数的范围内处理,虽然它以某种方式被接受但我只是好奇 是否有一种方法可以仅使用 int 数据类型实现递归函数?
即使我考虑使用 long long,我也无法在递归函数 reverseRec() 中实现它。
【问题讨论】:
-
log和pow- 甜蜜 -
在非递归函数中,将
val乘以10,然后加上数字。为避免溢出,您应该验证乘法和加法在之前是否可以工作。最大的正整数是 2147483647。所以检查是if (val > 214748364) { multiplication will overflow } else if (val == 214748364 && digit > 7) { addition will overflow }。