每日一题 02|算法题-整数反转

2020 年 12 月 12 日

阅读量:0

正文共 532 字,预计阅读时间 3 分钟

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

利用 Golang 数据类型特性

func reverse(x int) int {
  var ret int
  for x != 0 {
    if temp := int32(ret); int(temp * 10 / 10) != ret {
      return 0
    }
    ret = ret * 10 + x % 10
    x = x / 10
  }
  return ret
}

利用 JavaScript 位运算特性

var reverse = function (x) {
  let result = 0;
  while (x !== 0) {
    result = result * 10 + (x % 10);
    x = (x / 10) | 0;
  }
  return (result | 0) === result ? result : 0;
};

详解:创建初始 result 为 0,循环 x。

每次循环中将 result * 10 + (x % 10) 来拼接 result。result * 10 是将 result 提升一位,x % 10 是取 x 最后一位。 比如 result = 12, x = 345,运算后 result 就是 123。

在循环的最后将 x / 10。因为最后一位已经被拼接了,所以要去掉最后一位。如果 x / 10 的结果小于 1,就意味着这将是最后一位,这一步可以无视小数点,将 x 设置为 0。

这么做的好处是无需关心小数点和正负数的问题。

循环结束后,再去判断是否溢出 2 的 32 次方 -1。JavaScript 中的 number 类型数值虽然可以表示双精度 IEEE754 64 位浮点类型,但在使用按位运算符(Bitwise operators)进行比较时,会把操作数当作 32 位的比特序列。这也算是一个很多人都不知道的知识盲点。

var v1 = 9999999999;
var v2 = v1 | 0;
console.log(v2);

你好,我是 卢振千,一名软件工程师。欢迎你来到我的网站。