题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解法:
int reverse(int x){
int reverse = 0;
if((x <= -2147483648)|| (x >= 2147483647)){
return 0;
}
for(;x;){
//for(;x!=0;){
//while(1){
if((reverse < -214748364) || (reverse > 214748364)){ //注意条件判断也不能溢出
return 0;
}
reverse = 10*reverse + x%10;
x = x/10;
/*if(x == 0)
break;*/
}
思路:
1、需要判断输入和输出是否溢出;
2、采用数学算法进行整数中每位数字上的反转;
3、在乘、除、求余的计算中正负数不需要区分,只需要在输入值变为0值时跳出循环;
4、在最后返回数的时候注意正负。
从上述代码中可以看出,我一共采取了二种方法去做循环,结果如下:
第一种,执行用时:8 ms; 内存消耗 :6.8 MB
while(1){
…
if(x == 0)
break;
}
第二种,执行用时:8 ms;内存消耗 :6.8 MB
for(;x;){…}
其中有一点,在if判断条件里不能出现溢出的现象,我最开始使用的是:
if((reverse10 < -2147483648) || (reverse10 > 2147483647))
这样条件根本就不会去执行,因为reverse*10溢出了。