最近打算练习写代码的能力,因此从简单题开始作。
大部分仍是用C语言来解决。
@(解法).net
给出一个 32 位的有符号整数,你须要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:假设咱们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,若是反转后整数溢出那么就返回 0。code
具体连接 https://leetcode-cn.com/problems/reverse-integer/blog
其实这算很基础的问题了,首先就是想到利用循环结构,整数除法和取余来解决。但也会遇到边界值的问题,就要当心了。leetcode
初步的想法就是用一个while循环,在循环里面解决取余和倒序相加的工做。it
具体代码以下:class
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
我尝试提交后发现仍然会面临最大值溢出的问题,也不够安全,暂时没有找到更好的办法。
注意语句的顺序问题,尤为是判断语句和判断条件的运算的问题。 要考虑数据的溢出问题。 在本题中,仍是要先判断,再运算。