任务:
把任意整数 12345 转换成 54321 包括(-12345 ——> -54321)
计算过程中如有溢出返回 0。
智障的写法:
public static int reverse(int x) {
//定义两个极限值判断数据在计算中是否溢出溢出则返回 0
int min = Integer.MIN_VALUE;
int max = Integer.MAX_VALUE;
int mod = 10;
int tempX = x;
int singleNum = 0;
List<Integer> list = new ArrayList();
/*step1:首先使用循环把例如12345整数各个位置上的数(1,2,3,4,
5)单独取出来放到List数据结构中,取出的方法是让这个数(x % 10)
得出的结果就是相应位置上的数字,并放入List集合中保存,然后除以10
并赋值(x = x / 10)继续循环,直到 x 变为 0 退出循环。*/
for (;;) {
if (x == 0) {
break;
}
singleNum = x % mod;
x = x / mod;
list.add(singleNum);
}
/*
step2:这部作用就是把list集合中的数逐个取出,并通过循环根据list的大
小来算出当前数字的数量级(gap = gap * 10;),并在外层循环将list取
出的数字和这个gap相乘并加上上次计算的结果,依次类推就能得到最终
结果,最后的时候判断结果是否溢出。
*/
long result = 0;
for (int i = 0; i < list.size(); i++) {
long gap = 1;
for (int j = 0; j < list.size() - i - 1; j++) {
gap = gap * 10;
}
result = result + list.get(i) * gap;
if (result < min || result > max) {
return 0;
}
}
return (int) result;
}
优雅的写法:
public static int reverse(int x) {
int max = Integer.MAX_VALUE; // int最大值
int min = Integer.MIN_VALUE; // int最小值
long sum = 0;
/*
一次循环就行了,也是通过取模逐步取出每一位的上的数字,然后通过
sum = sum * 10 + temp; 让结果通过*10逐渐增长一位并且个位加上通过取
模取出的数字,最后通过x = x /10 去掉已经取出的数字。
*/
while (x != 0) {
int temp = x % 10;
sum = sum * 10 + temp;
if (sum > max || sum < min) // 溢出处理
{
sum = sum > 0 ? max : min;
return (int) 0;
}
x = x / 10;
}
return (int) sum;
}