Reserse_Integer(easy)

2017-07-08  本文已影响12人  KALong

任务:

把任意整数 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;
    }
上一篇下一篇

猜你喜欢

热点阅读