一起学算法-7.整数反转

一、题目

LeetCode-7.整数反转
链接:https://leetcode-cn.com/problems/reverse-integer/

难度:简单
给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。

如果反转后整数超过32位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:
输入:x = 123
输出:321

示例 2:
输入:x = -123
输出:-321

示例 3:
输入:x = 120
输出:21

提示:

  • -2^31 <= x <= 2^31 - 1

二、解题思路

首先我们想一下,怎么去反转一个整数?
把整数变成字符串,再去反转这个字符串吗?
这种方法是可以的,但是并不好。实际上我们只要能拿到这个整数的末尾数字就可以了。
以123为例,先拿到3,再拿到2,最后是1,然后按照顺序拼接就达到反转的效果了。
那么问题又来了,怎么拿到末尾数字呢?这个比较简单,取模就好了。
本题还要考虑负数的情况,所以判断条件不是x>0,而是x!=0
最后就是判断反转后的数是否会溢出,这个直接和32位的有符号整数214748364比较就行了。

三、实现过程

c++

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while(x!=0){
            //每次取末尾数字
            int tmp = x%10;
            //判断是否 大于 最大32位整数
            if (res>214748364 || (res==214748364 && tmp>7)) {
                return 0;
            }
            //判断是否 小于 最小32位整数
            if (res<-214748364 || (res==-214748364 && tmp<-8)) {
                return 0;
            }
            res = res*10 + tmp;
            x /= 10;
        }
        return res;
    }
};

PHP

class Solution {

    /**
     * @param Integer $x
     * @return Integer
     */
    function reverse($x) {
        $res = 0;
        while ($x) {
            $res = $res * 10 + ($x % 10);
            if ($res > 2147483647 || $res < -2147483647) return 0;
            $x = intval($x / 10);
        }
        return $res;
    }
}

JavaScript

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let res = 0;
    while (x) {
        res = res * 10 + (x % 10);
        if (res > 2147483647 || res < -2147483647) return 0;
        x = parseInt(x / 10);
    }
    return res;
};

四、小结

  1. 时间复杂度:O(log∣x∣)。翻转的次数即x十进制的位数。
  2. 空间复杂度:O(1)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容