(12) 7. 整数反转

题目链接:
https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
7. 整数反转
	给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字
	进行反转。
示例 1:
	输入: 123
	输出: 321
示例 2:
	输入: -123
	输出: -321
示例 3:
	输入: 120
	输出: 21
注意:假设我们的环境只能存储得下 32 位的有符号整数,
则其数值范围为 [−2^32^,  2^31^ − 1]。
请根据这个假设,如果反转后整数溢出那么就返回 0。

好菜鸡 我好菜。。 。 第一想法 转为字符串 然后写了一下 运行出错
好奇官方怎么写的 看一眼 转什么字符串啊!!! 效率低下!
并且 已经明确了数值的取值范围 (话说 为什么不给出231是多大啊 我没记住 感觉是不重要的也没算。。。。

现在思考一下 这道题该怎么做 首先应该求出 数值的范围
(-2,147,483,648‬,2,147,483,647)
然后就可以继续了

class Solution {
public:
    int reverse(int x) {
    	// 返回数
        int ans = 0;
        while (x != 0) {
        	//取余 获取x的末尾数字
            int pop=x%10;
            //已经取完一个数字后 除10
            x=x/10;
            // ans如果大于INT_MAX/10或者小于INT_MIN/10
            // 那么很显然在进行ans=abs*10+pop时 必会溢出
            // 若ans==INT_MAX/10  最大值2,147,483,647 
            // pop>7 ans=abs*10+pop溢出
            //若ans==INT_MIN/10  最小值-2,147,483,648 
            // pop<-8 ans=abs*10+pop溢出
            if (ans>INT_MAX/10||(ans==INT_MAX/10&&pop>7))
                return 0;
            if (ans<INT_MIN/10||(ans==INT_MIN/10&&pop<-8))
                return 0;
            ans=ans*10+pop;
        }
        return ans;
    }
};
//提示:
// 对于c++  判断是否溢出的方法有点复杂 
// --  说明  
// 头部数字为 若int有可能溢出的话  那么必为10位数  
// 此时最高位数字为1或2   那么对于 
// (ans==INT_MAX/10&&pop>7)和(ans==INT_MIN/10&&pop<-8) 
// 是多余的  所以这两个判断可以去除 (已经经过测试)
// (最后一次循环时  pop只能为1或者2  至于非最后一次循环 位数都
//  少 肯定是不会溢出的。。。。)
// 不过 如果是其他的数据类型 那么我们必须要注意


// 对于java 要简单一点 可以直接使用 
//     if ((ans * 10) / 10 != ans) 来进行判断 java中如果
//溢出 会返回为0 此时直接返回0即可   (c++ 会报错。。。)
//     有些人可能会担心  ans=ans*10+pop 会溢出 。。 其实不会
//前面的判断中说明 ans*10不会溢出 那么 pop为x%10  < 10 
//所以不会溢出

你可能感兴趣的:(菜鸟的算法学习)