目录
反转整数:
给定一个32位有符号整数,将整数中的数字进行反转。
示例1:
输入: 123
输出: 321
示例2:
输入: -123
输出: -321
示例3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储32位有符号整数,其数值范围是[-231,231 - 1]。根据这个假设,如果反转后的整数溢出,则返回0。
测试单元
如题我们先写一个测试单元(题目中已经给出3种可能出现的情况:一般情况正整数,负数,以零结尾的整数)还有一个条件就是得在瞄准者的可表示的范围内,所以。我们个这种情况也加上测试用例测试单元如下:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int n1 = 123;
int n2 = -123;
int n3 = 120;
int n4 = (INT_MAX + 1);
int n5 = (INT_MIN - 1);
int i1 = reverse(n1);
int i2 = reverse(n2);
int i3 = reverse(n3);
int i4= reverse(n4);
int i5 = reverse(n5);
printf("%d,%d,%d,%d,%d\n", i1, i2, i3,i4,i5);
system("pause");
return 0;
}
由题目知道:123-> 321可以将拆分为3 * 10的0次方+ 2 * 10的一次放+ 3 * 10的二次方由此可以用递归实现
(1)递归版
递归反回的条件是直到要反转的整数的第一位
加上我们要的范围条件就是反转后的整数在int可表示的范围内INT_MAX INT_MIN
int reverse(int x)
{
int Resault = 0;
static int Pos = 10;
if (x / 10 == 0) //递归返回的条件
{
Pos = 10;
return x;
}
Resault = reverse(x / 10) + x % 10 * Pos;
Pos *= 10;
if (Resault< INT_MIN || Resault>INT_MAX) //范围限定条件
{
return 0;
}
return Resault;
}
我们可以将递归版的优化为简单的循环来实现反转整数的目的:
(2)优化版1
我们害怕反转的值超出int可以有效表达的范围用长类型来表示反转后的值,在最后进行判定是否符合在int类型的有效表达范围。
int reverse(int x) {
long i = 0;
long t = x;
while (t)
{
i = 10 * i + (t % 10);
t /= 10;
}
if (i < INT_MIN || i >INT_MAX) //判定是否在int可表达的有效范围内
{
return 0;
}
return i;
}
这样判定放式只能在得到反转值之后进行判定,在反转过程种进行判定,可以更高效的解决这个问题。
(3)优化版2
只要在反转过程种不满足循环体种的式子就意味着这个传入的参数不合法超出了int可表示的范围
int reverse(int x)
{
int i = 0;
while (x)
{
int temp = i;
i = i * 10 + x % 10;
if ((i - x % 10) / 10 != temp)
{
return 0;
}
x /= 10;
}
return i;
}
(4)复杂度分析
- 时间复杂度:O(log(x)),x中大约有位数字。
- 空间复杂度:O(1)。