7.整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
这是我第一次没有看评论写出来的,当然,没有通过测试
#include<stdio.h>
int reverse(int x);
int main(){
printf("%d", reverse(-2147483648));
return 0;
}
//-2147483648~2147483647 10位
int reverse(int x){
int b[10] = {2, 1, 4, 7, 4, 8, 3, 6, 4, 7}; //这是大于0情况的
int a[10] = {0};//初始化,不然当x=0是会出现bug
int ifPositive = 1;//这个参数是为了记录该数为正或为负
int result = 0;
printf("%d\n", x);
if (x < 0){
x=-x;
ifPositive = 0;
}
printf("%d\n",x);
int i = 0;
while (x){ //x不为0
a[i] = x % 10;
x /= 10;
i++;
} //出来后i的最大值为10
if (i == 10){ //不要判断溢出
printf("判断溢出\n");
for(int j=0;j<10;j++)
printf("a[%d]:%d\n",j,a[j]);
int j = 0;
for (; j < 9; j++){ //比较除个位以外的数
if (a[j] == b[j]){ //相同,继续循环判断
printf("continue:%d\n",j);
continue;
}
else if (a[j] > b[j]){ //异常 返回
printf("return:%d\n", j);
return 0;
}
else{ //出现一次即代表 可以跳出循环
printf("break:%d\n", j);
break;
}
}
if (j == 9){ //继续判断
if (a[9] > b[9] - ifPositive){
return 0;
}
}
}
result = a[0];
for (int j = 1; j < i; j++)
{
result *= 10;
result += a[j];
}
return ifPositive ? result : -result;
}
在调试过程中我发现测试内容有一个为x=-2147483648,终于知道了为什么无法通过测试,当为32位int时,-2147483648转为正数也会因为溢出变为2147483647(正向最大)+1=-2147483648,但是我也不知道这应该怎么解决,有大佬啊知道的话请带带我
看了官方的解法我感觉我还是太菜了
手动转下c语言
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;//没啥好说的
x /= 10;//没啥好说的
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;//这里这个pop判断很有灵性.
rev = rev * 10 + pop;
}
return rev;
}
复习一下c语言负数取余的知识
嗯 比如-7%3=-1 就是 -7+3+3=-1
然后写一句提醒自己,这不是汇编,把数字拆分成数组并不会提升速度(我也不太清楚,反正这样写很麻烦,大概性能提升也不明显),可我就是个强迫症......,反正下次不这样写了
嘛 感觉官方这个算法很神秘,我可能一时半会想不出来,时间复杂度是O(log(x)) 空间复杂度是O(1)
先自己写一遍看看 第二轮做的时候先复习8