7.整数反转

题目描述

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围\([-2^{31},2^{31}-1]\),就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:
输入:x = 123
输出:321

示例 2:
输入:x = -123
输出:-321

示例 3:
输入:x = 120
输出:21

示例 4:
输入:x = 0
输出:0

提示:\(x\in[-2^{31},2^{31}-1]\)

这道题目比较简单,首先思考把每一位数都存储起来,然后进行反转求和,就可以得到答案。

第一版代码
int reverse(int x) {
        char rev[50];
        int i=0,num=0,ans=0;
        while(x!=0){
            rev[num]=x%10;//使用数组记录每一位
            x=x/10;
            num=num+1;//用num记录位数大小
        }
        for(i=0;i<num;i++){
            ans=ans*10+rev[i];//复原该数
        }   
	return ans;
}

1.在代码完成中有一些tips需要注意:%表示求余数,在负数求余数时会得到负余数,例如:

cout << -21 % -5 << endl;//将会输出-1
cout << -21 % 5 << endl;//将会输出-1
cout << 21 % -5 << endl;//将会输出1

2. 没有必要写成两个for循环,因为前面的最后以为刚好是反转后数的第一位,需要不断的乘10.

第二版代码
int reverse(int x) {
        int i=0,num,ans=0;//不需要进行存储数组,直接进行求和
        while(x!=0){
            num=x%10;
            x=x/10;
            ans=ans*10+num;
        }
	    return ans;
}

但是这个题目有一个需要注意的地方,就是当题目这个数反转会溢出时,需要返回0。所以在求和的时候需要多一步判断是否溢出:

ans为正数时:如果ans>INT_MAX/10,则返回0,如果ans==INT_MAX/10,当num大于INT_MAX的最后一位就会上溢出。

ans为负数时:如果ans<INT_MIN/10,则返回0,如果ans==INT_MIN/10,当num小于INT_MIN的最后一位就会下溢出。

答案
int reverse(int x) {
        int i=0,num,ans=0;
        while(x!=0){
            num=x%10;
            x=x/10;
            if(ans>INT_MAX/10||(ans==INT_MAX/10&&num>INT_MAX%10)){
                return 0;//加上这两句判断语句即可
            }else if(ans<INT_MIN/10||(ans==INT_MIN/10&&num<INT_MIN%10)){
                return 0;
            }
            ans=ans*10+num;
        }
	return ans;
    }

留下评论