# 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
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

# 复杂度分析

  1. 时间复杂度:

    • 字符串转换和反转操作的时间复杂度都是 O(n),其中 n 是输入数字的位数。
    • 数组反转操作的时间复杂度也是 O(n),因为需要遍历数组。
    • 将数组拼接成数字的时间复杂度也是 O(n)。
    • 最后的边界检查是常数时间复杂度 O(1)。
    • 综上所述,整个函数的时间复杂度是 O(n)。
  2. 空间复杂度:

    • 首先需要将数字转换成字符串并存储,所以空间复杂度是 O(n),其中 n 是输入数字的位数。
    • 然后需要将字符串转换成数组存储,所以需要额外的 O(n) 空间。
    • 数组反转和拼接数字时并没有使用额外的空间,所以空间复杂度仍然是 O(n)。
    • 最后的边界检查是常数空间复杂度 O(1)。
    • 综上所述,整个函数的空间复杂度是 O(n)。

综上所述,函数的时间复杂度和空间复杂度都是 O(n),其中 n 是输入数字的位数。因为这里没有采用任何类似于二分查找等高效算法,而是直接遍历数字的每一位并进行操作,所以时间复杂度无法更优。

最后更新时间: 3/14/2024, 9:39:00 AM