每日一道算法-7.整数翻转

176 阅读1分钟

问题链接: leetcode-cn.com/problems/re…

所用技巧:Number

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

读题审题

  1. 输出的数据是有范围的[-231,231-1]
  2. 输入的数据是有符号的

暴力解法

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    let revNum = ''
    for(const i of `${Math.abs(x)}`){
      revNum = i + revNum
    }
    if(revNum < Math.pow(-2,31) || revNum > Math.pow(2,31) -1){
      return 0
    }
    return x > 0 ? revNum * 1 : revNum * -1
};
  • 时间复杂度O(n)
  • 执行用时: 80 ms
  • 内存消耗: 39.4 MB

解法说明

  1. 将数字的绝对值转换成一个字符串,循环这个字符串
  2. 循环过程中,将前一个item加到下一个字符串的后面
  3. 将循环后的字符串转换成数字,注意正负数和数字的范围

暴力解法二


/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
  let num = 0
  while(x !== 0){
    const i = x % 10
    x = ~~(x/10)
    num = num*10+i
  }
  if(num < Math.pow(-2,31) || num > Math.pow(2,31) -1){
    return 0
  }
  return num
};

  • 时间复杂度O(n)
  • 执行用时: 80 ms
  • 内存消耗: 39.2 MB

解法说明

  1. 每次都要拿到这个数字的末尾数字
  2. 再将这个数字按照顺序给拼接起来得到一个最终结果
  3. 需要判断得到的值的范围