LeetCode - Reverse Integer

本文介绍了一个简单的整数反转算法,并探讨了如何处理反转过程中可能出现的溢出问题。此外,还分享了一个因数据类型不同导致程序移植时出现错误的案例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题注

今天继续刷,可能这几天确实想编程了,总是看理论自己也受不了… 毕竟还是希望能够把学到的理论应用到实际当中嘛。虽然这么干学的东西要超多,而且很辛苦,但是很开心!

题目

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?

Throw an exception? Good, but what if throwing an exception is not an option? You would then have to re-design the function (ie, add an extra parameter).

分析

这道题本身并不太难,只要注意正负数的形式就好了。这题比较麻烦的地方在于后面的Have you thought about this?第一个问题比较容易处理,实际上如果按照正确的思路几乎可以不用处理。第二个问题比较有意思,overflow的问题经常会出现在编程过程中。而且由于Java中并没有unsigned的这个概念,更需要注意这里面的问题了。实际上,由于int第一位表示符号位,所以造成overflow的情况主要是因为被Reverse的数最后一位是1。处理这个问题的通用方法是按照Discuss中所讨论的,设置一个Parameter为0x7FFFFFFF,如果Reverse的结果与这个Parameter进行与运算后结果不等于本身,那么证明Reverse的数Overflow了。

说到这里,想起了大概一年前一个将Windows代码移植到Linux上面遇到的一个很有意思的问题。源代码是纯C语言编写,使用char数组对二进制数据进行处理。但是,将程序原封不动地移植到Linux下面后发现运行结果总是错误的。排查了半天,最后的结论是:在Windows下面,char的默认定义为unsigned char,但是在Linux下面,char的默认定义为signed char。由于符号位的干扰,会导致解析数据时将符号位为1的数进行负数处理,导致了结果的错误。正式因为遇到过这样的问题,看到Overflow的问题时才能很快地想出解决方法。所以说,编程中会遇到很多很多奇怪的问题,多发现多总结,水平就上来了。

代码

下面的代码没有加入对Overflow情况的处理。实际上,LeetCode也没有针对Overflow情况的检测。这是情有可原的,因为如果Overflow了,返回什么呢?对于Java来说,最好的方法就是throw exception。不过,按照题目所说,add an extra parameter也是一个可行的办法。不过这可能超出LeetCode所能检测的范围了。

public class Solution {
    public int reverse(int x) {
        boolean isNeg;
        if (x < 0){
            isNeg = true;
            x = -1 * x;
        }else{
            isNeg = false;
        }
        int reverResult = 0;
        while (x != 0){
            reverResult = reverResult * 10 + x % 10;
            x = x / 10;
        }
        if (isNeg){
            reverResult = -1 * reverResult;
        }
        return reverResult;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值