C语言用循环结构反转数,【LeetCode】 #7:反转整数 C语言

本文探讨了如何在C语言中处理32位有符号整数反转的边界条件,避免溢出。作者分享了初始的循环方法、使用long int类型的优化,以及官方题解中的判断距离策略。重点在于理解判断语句顺序和数据溢出的防范技巧。
摘要由CSDN通过智能技术生成

最近打算练习写代码的能力,所以从简单题开始做。

大部分还是用C语言来解决。

@(解法)

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123

输出: 321

示例 2:

输入: -123

输出: -321

示例 3:

输入: 120

输出: 21

注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

具体链接 https://leetcode-cn.com/problems/reverse-integer/

思路

其实这算很基础的问题了,首先就是想到利用循环结构,整数除法和取余来解决。但也会遇到边界值的问题,就要小心了。

初步想法

初步的想法就是用一个while循环,在循环里面解决取余和倒序相加的工作。

具体代码如下:

int reverse(int x) {

int num = 0;

while (x)

{

num = num * 10 + x % 10;

if (num > INT_MAX || num < INT_MIN)//边界值判断

return 0;

x = x / 10;

}

return num;

}

但是这种结构很容易遇到一个问题,就是当num达到边界时,再进行*10的运算就会==溢出==了,但判断在运算之后。

但是我又想到在C语言中还有long int类型,所以只要定义num为long int即可。

最后也通过了,代码如下:

int reverse(int x) {

long int num = 0;

while (x)

{

num = num * 10 + x % 10;

if (num > INT_MAX || num < INT_MIN)

return 0;

x = x / 10;

}

return num;

}

总结:这种改善也只是一种取巧的方法,当数据更大时就没办法了,而且会浪费很多空间。

进一步想法

于是我看了官方题解,发现官方是通过判断num与边界值的距离来避免溢出的。

我首先将if判断进行了替换,但发现还是不能通过,因为最小的边界还是会溢出,然后我发现官方题解中是先判断再进行倒序操作的,这样就可以有效解决问题了。

int reverse(int x) {

int num = 0;

while (x)

{

if (num > INT_MAX/10 || (num == INT_MAX / 10 && (x%10) > 7)) return 0;

if (num < INT_MIN/10 || (num == INT_MIN / 10 && (x%10) < -8)) return 0;

num = num * 10 + x % 10;

x = x / 10;

}

return num;

}

我觉得这个方法要求的判断条件太细致了,然后去网上看了看其他人的解法。有博主提到利用反推法判断是否溢出,但其实这种方法也是先计算再判断的。

具体链接 https://blog.csdn.net/bingkuoluo/article/details/83046469

我尝试提交后发现仍然会面临最大值溢出的问题,也不够安全,暂时没有找到更好的办法。

总结

注意语句的顺序问题,尤其是判断语句和判断条件的运算的问题。

要考虑数据的溢出问题。

在本题中,还是要先判断,再运算。

内容来源于网络如有侵权请私信删除

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值