目录

  • 1.题目及测试用例
  • 2.解题思路
  • 3.代码实现
  • 4.复杂度说明


1.题目及测试用例

题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2**31, 2**31 − 1] ,就返回 0
假设环境不允许存储 64 位整数(有符号或无符号)。
-2**31 <= x <= 2**31 - 1

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

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

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

示例 4:
输入:x = 0
输出:0


2.解题思路

根据-2**31 <= x <= 2**31 - 1可以看出x的取值范围,那么存在X0的情况,那么首先判断其是否为0,如果为0那么我们直接返回0,然后,将整数转换成字符串进行处理。

如果整数是负数,则将负号保存在变量_中,并将负号从字符串中去除。

接下来,使用一个循环从字符串的最后一个字符开始,逆序拼接到新的字符串str中。

然后,通过一个循环去除反转后字符串开头的0。循环中判断str的第一个字符是否为0,如果是,则把这个0去除掉。

接着,判断反转后的整数是否越界。如果越界,则直接返回0

最后,返回带有负号的字符串_与反转后的字符串str拼接成的整数。


3.代码实现

var reverse = function (x) {
    if (x == 0) {
        return 0
    }
    let _ = ''
    x = x.toString()
    if (Number(x) < 0) {
        _ = x[0]
        x = x.slice(1)
    }
    let str = ''
    for (let i = x.length - 1; i >= 0; i--) {
        str += x[i]
    }
    for (let i = 0; i < str.length; i++) {
        if (str[0] == 0) {
            str = str.slice(1)
        }
    }
    if ((Number(_ + str)) >= (2 ** 31) - 1 || (Number(_ + str)) <= -(2 ** 31)) return 0
    return _ + str
};

4.复杂度说明

时间复杂度:

将整数转换为字符串的操作具有O(log(x))的时间复杂度,其中x是输入整数。这是因为数字转字符串的时间复杂度与数字的位数成正比。

使用循环将字符串逆序拼接到新的字符串str中,需要遍历字符串的长度,时间复杂度为O(log(x))

使用循环去除反转后字符串开头的0,最坏情况下需要遍历整个字符串的长度,时间复杂度为O(log(x))

将反转后的字符串转换为整数可以视为常数时间操作,不会对总体的时间复杂度产生影响。

空间复杂度:

将整数转换为字符串后,需要额外的空间存储字符串表示的整数,空间复杂度为O(log(x))

创建新的字符串str存储反转后的结果,需要的额外空间也是O(log(x))

除了上述两个额外的空间,函数没有使用额外的数据结构,因此除了字符串所占用的空间外,没有额外的空间开销。

综上所述,该函数的时间复杂度为O(log(x)),空间复杂度为O(log(x))