算法入门练习:leetcode 整数反转(简单)(C++)

题目:

思路:

  1. 将int类型转换成string类字符串,使用swap模板函数来进行反转,然后返回int类型
  2. 每次弹出最后一个数,将其作为新数据的第一位数,以此类推

解:(不考虑环境只能存储32位的有符号函数这一限制)

  1. int reverse(int x)
    {
    	string str;
    	//将int转换为string类型
    	stringstream iToS;
    	iToS << x;
    	iToS >> str;
    	//倒转string
    	int i;
    	int li = 1;//从后部计时
    	for (i = 0; i < str.size() - li; i++)
    	{
    		if ('-' == str[i])
    			continue;
    		swap(str[i], str[str.size() - li]);
    		li++;
    	}
    	//将string转换为int
    	stringstream sToI;
    	sToI << str;
    	//判断x是否越界
    	long long temp;
    	sToI >> temp;
    	if (temp > INT_MAX || temp < INT_MIN)
    		temp = 0;
    	x = static_cast<int>(temp);
    
    	return x;
    }

     

  2. int reverse(int x) {
    	int a[10];
    	int i;
    	for (i = 0; i < 10 && x != 0; i++)
    	{
    		a[i] = x % 10;
    		x /= 10;
    	}
    	long long sum = 0;
    	for (int j = 0; j < i; j++)
    	{
    		sum += a[j] * pow(10, i - j - 1);
    	}
    	return (sum > INT_MAX || sum < INT_MIN) ? 0 : static_cast<int>(sum);
    }

     

然而上面两种方法的时间复杂度都是O(n²)。。。

然后我去看了其他人的C++解法,有这么一则:

int reverse(int x) {
        long rev = 0;
        while (x) {
            int pop = x % 10;
            x /= 10;
            rev = rev * 10 + pop;
        }
        return (rev > INT_MAX || rev < INT_MIN) ? 0 : static_cast<int>(rev);
    }

/*作者:anql
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-c-by-anql/
来源:力扣(LeetCode)*/

这个解法能够在通过leetcode,然而当我将其放在vs2019运行时,结果不同。

举例:设x=1234567899,该程序在Leetcode上得到0,在vs2019上得到1397719729

经过调试得到,在rev * 10 + pop这一步,符号整型超越了限制(上溢和下溢)

如图:有、无符号short类型的溢出

C++primer plus6

而rev * 10 + pop=1397719729 是 9987654321经过了几轮的重置之后得到的,因此(1)应该在这一步之前就开始检查溢出情况

(2)再加上我们之前忽略的题目的限制(我看到了有老哥提出了这一问题才注意到。。。然而我太菜了不能理解这个限制是干啥的。。。想了半天得出的结论是不能使用8字节的long long、double。。emm..前面的解法都是不正确的。。)

最后,附上官方解(链接里有思路):

 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;
            rev = rev * 10 + pop;
        }
        return rev;
    }

/*作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
来源:力扣(LeetCode)*/

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值