题目概述
- 题目:第七题
- 难度:简单
- 内容:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。 示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-integer
第一次思路
第一次只考虑了三位整数,没有思考整数的取值范围问题。
Code
class Solution {
public:
int reverse(int x) {
int bai;
int shi;
int ge,y;
bai = x/100;
shi = x/10%10;
ge = x%10;
y=ge*100+shi*10+bai;
if(x<0)
{
return y=-y;
}
return y;
}
};
测试 Submit
测试结果只能满足三位整数,其他情况均不满足
分析
题目有两个注意点 :
- 32 位的有符号整数,值得是范围从负 2,147,483,648(用 Int_MIN 常数表示)到正 2,147,483,647 (用 Int_MAx 常数表示)的值,不只是三位整数
- 反转的方式
改进
-
在-9到9的数,可以直接输出
-
溢出的数字,返回0;
-
中间部分使用while循环来解决。
①. 定义一个新的长整形来存放反转后的数
②. 对x进行取余运算,然后将结构传递给y。比如:321,对10取余为1,将1传递给y,x对10取整,为32;在第二次循环中,将y*10,等于10,然后重复操作,y=12,x=3,y=123,x=0,然后退出循环
改进Code
class Solution {
public:
int reverse(int x) {
long y=0;
if(x>-9&&x<9){
return x;
}
else{
while(x){
y=y*10;
if(y<=INT_MIN||y>=INT_MAX)
return 0;//溢出
y=y+x%10;
x=x/10;
}
return y;
}
}
};
改进Submit
_@~L5.png)
收获总结
题目比较简单,但是有细节需要考虑,比如溢出问题,还有代码简化问题。