题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 | 示例 1: | 示例 2: | 示例 3: |
---|---|---|---|
输入: | 123 | -123 | 120 |
输出: | 321 | -321 | 21 |
注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
本人C语言代码如下:
int reverse(int x) {
long int reverse_x=0;
int bit[11]; //存储每次循环的最后一位
int i=0,j=0;
int term=0; //交换时的临时变量
long int coef=1; //所乘时的系数
int flag=0; //符号位
if(x<0){ //解决负数问题
flag=1;
x=-x;
}
for( ; x!=0&&i<11; i++){ //存储循环每一位
bit[i]=x%10;
x/=10;
}
for(j=i-1; j>=i/2; j--){ //逆序交换
printf("1.%d,%d\n",bit[j],bit[i-j-1]);
term=bit[j];
bit[j]=bit[i-j-1];
bit[i-j-1]=term;
printf("2.%d,%d\n",bit[j],bit[i-j-1]);
}
for(j=0; j<i; j++){ //得到逆序之后新的数
reverse_x+=bit[j]*coef;
coef*=10;
printf("%ld\n",reverse_x);
}
if(flag){ //负数解决
reverse_x=-reverse_x;
}
if(reverse_x>(0x1<<31)-1||reverse_x<((-0x1)<<31)){ //防止溢出
return 0;
}
return reverse_x;
}
写代码是其实问题不大,只要解决负数和溢出情况即可。负数容易解决,重点区分溢出情况。
我是使用long类型来解决,要是还是使用int的话在最后反转时还是会溢出。但是刚开始只是reverse_x使用了long,但是还是会出现溢出,后来检查时发现问题出现在coef上。这个在求reverse_x的中间变量在位数过多时先溢出导致最后的结果错误。所以将其也定义为long类型解决问题。
题目提供的答案主要是使用栈的后入先出特性来解决反转问题,但是要解决溢出,使用了一个判断方法。答案链接如下:答案