目录
- 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的取值范围,那么存在X
为0
的情况,那么首先判断其是否为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))
。