【LeetCode】整数反转(简单)- JavaScript描述- 多种解法 - JS取整技巧

1,375 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

很多小伙伴都想刷算法题,但是不知道如何下手,导致一直都没有开始~ 今天YK菌带你一起刷LeetCode,我们先从简单题开始刷起!!!慢慢成长!!!刷题就从今天开始吧!!!接下来我会发一系列的力扣题解,欢迎关注

JavaScript版本哦~ 会用到很多特性,不过别担心,我会解释给你听的!

7. 整数反转(简单)

leetcode-cn.com/problems/re…

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

【解法一】反转字符串

这题一拿到手,最先也是最容易想到的就是将数字传转换成字符串然后进行反转

数字 ——> 字符串 ——> 数组 ——> 反转 ——> 字符串 ——> 数字

在这里插入图片描述

注意分清楚正负号,还有题目的条件,即可得到答案

var reverse = function(x) {
  let res = 0;
  if (x >= 0) {
    res = +String(x).split("").reverse().join("");
  } else {
    x = -x;
    res = -String(x).split("").reverse().join("");
  }
  if(res > 2**31 - 1 || res < -(2**31)) return 0;
  return res;
};

在这里插入图片描述

再想着用数学的方式来试试,不需要开辟新的空间来进行反转

【解法二】商与余数

整数除以10 余数为其个位数 为去除个位数的剩余数字 (需要取整)

在这里插入图片描述

整体思路就是遍历(x / 10商)数字x,每次拿数字的个位(x % 10 余数),直到拿完。 每次遍历都将x的个位 拼接到result的新腾出的个位上(result = result * 10 + (x % 10);

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function (x) {
  let result = 0;
  while (x) {
    result = result * 10 + (x % 10);
    if (result > 2 ** 31 - 1 || result < -(2 ** 31)) return 0;
    x = ~~(x / 10);
  }
  return result;
};

在这里插入图片描述

【技巧1】~~取整(舍去小数位)

~按位取反

对于整数相当于取反减一

~0 === -1
~1 === -2
~-1 === 0
~-2 === 1

对于小数相当于舍去小数位再取反减一

~0.3 === -1
~1.7 === -2
~-0.3 === -1
~-1.2 === 0
~-2.9 === 1

~~按位取反再取反

对于整数还是自身

~~1 === 1
~~-1 === -1
~~0 === 0

对于小数,等于舍去小数位 相当于正数向下取整,负数向上取整

~~1.1 === 1
~~1.9 === 1
~~-1.1 === -1
~~-1.9 === -1

【技巧2】Math.floor() 向下取整

Math.floor()向下取整

Math.floor(1.1) === 1
Math.floor(1.9) === 1
Math.floor(-1.1) === -2
Math.floor(-1.9) === -2