7.Reverse Integer(Easy)

2016-10-11  本文已影响9人  兰缘小妖

Reverse digits of an integer.
反转一个整数的数字
Example1: x = 123, return 321
Example2: x = -123, return -321

  看似没有坑,实则不然,因为在这个题目里面,隐含的条件还有要做溢出处理,即输入一个超过Integer最大值的整数

My Solution

(Java) Version 1 Time: 43ms:

  首先想到的做法就是把整数当做个字符串进行反转,刚好前几天做过了反转字符串的操作,这里直接应用,然后就通过了,关键是用long类型来装传入的int值,就可以有效避免在运算中溢出的问题

public class Solution {
    public int reverse(int x) {
        if(x>-10&&x<10)
            return x;
        long y = x;
        long z = Math.abs(y);
        boolean isNegative = x > 0;
        String s = String.valueOf(z);
        char[] chars = s.toCharArray();
        char c;
        for (int i = s.length() - 1, j = 0; j != chars.length / 2; i--, j++) {
            c = chars[j];
            chars[j] = chars[i];
            chars[i] = c;
        }
        z = Long.parseLong(String.valueOf(chars));
        if(z>Integer.MAX_VALUE)
            return 0;
        return (int)(isNegative ? z : -1 * z);
    }
}

(Java) Version 2 Time: 41ms:

  除去字符串操作,这个解法就是典型的直接对数字进行处理,从各位开始取数,然后一位一位取到最高位,组成一个新的数,就是结果,代码显然是简短了很多,处理仍然是用long作操作数,本来我以为上一个解法会比这个直接操作整数的解法更快,不过似乎被打脸了,应该是数转字符串耗费了不少的时间,也可能是因为题目的范围仅仅是在整数的范围里,长度较短,字符串反转的优势没有显现。当然,根据leetcode的尿性,这两个解法都是属于同一个时间复杂度的,并没有明显的差距

public class Solution {
    public int reverse(int x) {
        long y;
        long z = x;
        boolean isNegative = x > 0;
        z = Math.abs(z);
        y = z % 10;
        z /= 10;
        while (z != 0) {
            y = y * 10 + z % 10;
            if (y > Integer.MAX_VALUE)
                return 0;
            z /= 10;
        }
        return (int)(isNegative ? y : -1 * y);
    }
}

  发现discuss里其他的Java解法似乎也是大同小异,并没有更快的,都是40ms左右,但是同样是直接操作整数C++却只要6ms,这…………

上一篇下一篇

猜你喜欢

热点阅读