关于LeetCode中Reverse Integer一题的理解

题目如下:

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

Have you thought about this?

Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!

If the integer's last digit is 0, what should the output be? ie, cases such as 10, 100.

Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows. How should you handle such cases?

For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

题目的意思很明了,将一个整数倒过来。这里我们主要要考虑两种特殊情况,第一种是输入值x为负数的情况,另一种是输入值虽然是int类型,但是倒过来之后就超出了int的最大值,例如:x若为1000000003,这个输入是合法的,但是x进行reverse操作后就变成了3000000001,比int的最大值还要大,所以这种情况我们也要进行判断,如果不能进行合法输出,就直接输出0即可(输出0也是题干要求的,代表输出结果已经超过了int的最大值,发生了溢出)我的思路是先将该int类型的x转化为String类型,如果x大于等于0就直接进行转化,如果x小于0就先将符号去掉,直接转化符号后面的部分。然后将得到的字符串按照每一位的顺序push进一个栈(Stack)中,全部push进入后在进行pop操作,这样其实就实现了字符串的reverse操作,这里为什么要用栈呢?假如说我们要reverse的对象不是一个字符串,而是一个链表,链表可是没有charAt()这种非常方便的操作的,拼接起来更是没有字符串那么遍历,直接进行reverse需要来回调动指针的指向,非常不方便。但是使用了Stack后一切就不一样了,你只需push,然后pop,把先pop出来node的next指向下一个pop出来的node即可,非常方便。额,有点扯远了。言归正传,最后你需要做的就是判断你得到的这个reverse后的数是否还是int类型的。我们先把这个数转换成long类型的,然后在将其和int的最大值进行比较。当然,这个int的最大值你也需要转换成long类型的,如果小于int最大值,则根据之前的正负判断添加负号后转为int类型输出,否则的话直接输出0结束。思路大概就是这样,代码实现如下:

<span style="font-size:14px;">Stack<String> stringStack = new Stack<String>();
        String origin = x+"";
        int begin;
        if (x < 0){
            begin = 1;
        }else{
            begin = 0;
        }
        for(int i=begin;i<origin.length();i++){
            stringStack.push(origin.charAt(i)+"");
        }
        StringBuilder sb = new StringBuilder();
        while(stringStack.size()!=0){
            sb.append(String.valueOf(stringStack.pop()));
        }
        long test = Long.parseLong(sb.toString());
        long compare = 2147483648L;
        if (test >= compare ){
            return 0;
        }else{
            if (begin == 1){
            sb.insert(0, "-");
            }
            return Integer.parseInt(sb.toString());
        }</span>
评论区还有一种方法是和之前判断回文数那一道题方法一样的,这里也不赘述了,直接放代码:

<span style="font-size:14px;">public int reverse(int x) {
        long rev= 0;
        while( x != 0){
            rev= rev*10 + x % 10;
            x= x/10;
            if( rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE)
                return 0;
        }
        return (int) rev;
    }</span>

LeetCode评论区一般都是用这种方法做的,没有特别新颖的了。

算法这个东西就是这样,你只有自己实现了,看到别人好的方法的时候才会有“Wow,原来可以这么玩!”这种感慨,所以还是任重而道远啊......

另 不要脸的奉上回文数那一题自己的理解,文章地址在这里:http://blog.csdn.net/zsy112371/article/details/52319035


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值