# NC57.反转数字
# 题目描述 (opens new window)
TIP
标签:数学
关联企业:字节跳动、美团、携程、腾讯、小米集团
# 算法思路
这道题目,将数字转换成字符串 再反转回来是最直观的解法,但是需要注意对边界条件的处理。
这道题目在牛客平台上测试用例看起来更加严谨,对于边界条件0,需要返回0,而不是-0
,这点要特别注意。
/**
* @param {number} x
* @return {number}
*/
var reverse = function (x) {
// 将数字类型首先处理成不带符号的字符串 然后分割成数组
let numberToArray = String(Math.abs(x)).split('')
// 对数组进行遍历,将数组反转 这里使用了反转数组的api
let resArr = numberToArray.reverse();
// 将数组再变成number 这里使用三目运算符
// 如果x是大于0的数,直接拼接起来转换成数字即可
// 如果x是小于0的数,转换成数字之后需要取反
let resNumber = x > 0 ? Number(resArr.join('')) : -Number(resArr.join(''))
// 最后对于边界问题进行处理
if (resNumber < Math.pow(-2, 31) || resNumber > (Math.pow(2, 31) - 1) || resNumber === 0) {
return 0
}
return resNumber
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function reverse(x: number): number {
const numberToArray = Math.abs(x).toString().split('');
const resArr = numberToArray.reverse();
const resNumber = x > 0 ? Number(resArr.join('')) : -Number(resArr.join(''));
if (
resNumber < Math.pow(-2, 31) ||
resNumber > Math.pow(2, 31) - 1 ||
resNumber === 0
) {
return 0;
}
return resNumber;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# 复杂度分析
时间复杂度:
- 字符串转换和反转操作的时间复杂度都是 O(n),其中 n 是输入数字的位数。
- 数组反转操作的时间复杂度也是 O(n),因为需要遍历数组。
- 将数组拼接成数字的时间复杂度也是 O(n)。
- 最后的边界检查是常数时间复杂度 O(1)。
- 综上所述,整个函数的时间复杂度是 O(n)。
空间复杂度:
- 首先需要将数字转换成字符串并存储,所以空间复杂度是 O(n),其中 n 是输入数字的位数。
- 然后需要将字符串转换成数组存储,所以需要额外的 O(n) 空间。
- 数组反转和拼接数字时并没有使用额外的空间,所以空间复杂度仍然是 O(n)。
- 最后的边界检查是常数空间复杂度 O(1)。
- 综上所述,整个函数的空间复杂度是 O(n)。
综上所述,函数的时间复杂度和空间复杂度都是 O(n),其中 n 是输入数字的位数。因为这里没有采用任何类似于二分查找等高效算法,而是直接遍历数字的每一位并进行操作,所以时间复杂度无法更优。