小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
很多小伙伴都想刷算法题,但是不知道如何下手,导致一直都没有开始~ 今天YK菌带你一起刷LeetCode,我们先从简单题开始刷起!!!慢慢成长!!!刷题就从今天开始吧!!!接下来我会发一系列的力扣题解,欢迎关注
JavaScript版本哦~ 会用到很多特性,不过别担心,我会解释给你听的!
7. 整数反转(简单)
给你一个 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