题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2的31次方, 2的31次方 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题解:
首先进行数字反转,我们第一时间想的肯定是,怎么把数字拆分啊?回想一下所学的知识,用取余就能取到数字 了呗。
取余的过程:
123%10=3 、123/10=12
12%10=2 、12/10=1
1%10=1,
然后再拼接一下
3* 10 *10 =300
2 * 10 =20
1
相加不就等于321了吗?
那么如果数字长度再大一点呢?如果数字为负数呢?
那么我们设一下传过来的值为X
则取余x%10,得来个参数接收一下吧设个res 吧。
那么res =x%10
余数知道了,是否就得将 余数 * 10 * 你取余几次吧
那就得到res * 10 * 取余次数
再者我们既然是取余到0为止,那么为啥不设置一个判断条件呢?
就比如说while(x!=0)?
那么根据这个判断条件就可以知道取余多少次了呗!!
那么开始的肯定是:res=0, temp接收也为0;
temp = x%10 + res * 10 既 res =x%10 + res * 10
这里的+号,代表拼接的意思啊。就比如上面的3*10+2 再循环一次就是3 * 10 *10 + 2 * 10 +1
那么根据上面的分析还得在循环中加上 x/10
我们再看看题目:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2的31次方, 2的31次方 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
什么意思啊?
举个简单例子:
假设125处于int型的最大值,那么反转一下这521就出long型了,超出了范围,就为整数溢出。
那么根据这个例子是否可以知道最后返回的res可以根据这个整型和长整型判断
由此可得
(int) res == res ? (int) res : 0;
最后看一下总体代码
总体代码
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int a = sc.nextInt();
System.out.println(reverse(a));
}
}
public static int reverse(int x) {
long res = 0;
while (x != 0) {
res = res * 10 + x % 10;
x /= 10;
}
//判断是否溢出
//如果res溢出了,则为long型(这个是毋庸置疑的)
//按照下面的等式可知:
// 则你拿一个(int)res这个强转为int型的res 跟 res可能为long型,可能为int型的进行比较,
// 如果res为int型,那么相等,则没有溢出。如果res为long型,那么则不相等,就溢出呗。
return (int) res == res ? (int) res : 0;
}
}
算法题来源:力扣
欢迎朋友们一起进步!!!
2020-12-10