前言:
相信很多同学在看到算法的时候都会两眼发黑,觉得明明就是很简单的小学生应用题,但却非要你用一种极其复杂的方法去解题。因此,很多同学面对算法无从下笔,算法也就成了很多同学的噩梦。所以今天,我们一起来到LeetCode的第7题-整数反转的奥秘。我们要将算法的难点,复杂点各个击破,学会举一反三。
一.弄清题目需求,分清题目具体问什么?
从下面这张图片我们可以看出题目给我们一个有效整数x,将这个整数翻转(只是数字部分),那么我接下来详细剖析这个问题的特别之处:
// 输入123,输出321
// 输入-123,输出-321,而不是321-
// 输入120,输出21,而不是021
在这个解析中我们可以看出:
1.如果x是负数,那么负号还是放在首位,不用翻转
- 我们可以优先处理负号:用Math.abs(x)取x的绝对值,使得后续结果为无负号的纯数字,(-123)变为(123),接着用to.String()转变为字符串。
- Math.abs(x):
- (若x为1,则结果为1。若x为0,则结果为0。若x为-1,则结果为1。)
- 接下来就是反转字符串:将"123"用我们常见的split('').reverse().join('')反转得到"321"。
- 将字符串转变为数字:用parseInt可以将字符串("321")转变为数字(321)。
- 恢复符号:若初始数字x为负,则返回结果为负,否则无需改变。
- Math.sign(x):
- (若x为-1,结果为-1,若x为1,则结果为1。若x为0,则结果为0)
2.如果x的末尾是0,则自动忽略
- 用parseInt 自动省略
总结在一起的代码表示就是
const reversed=parseInt(Math.abs(x).toString().split('').reverse().join(''))*Math.sign(x);
二.检查题目注意事项,范围条件
从上面这张图片我们可以看出:
-
题目所给出x的取值范围 :
-(2**31) <= x <= 2**31 - 1超出范围则取0。 -
我们可以这样写:
if(reversed<-(2**31)||reversed>2**31-1){ return 0; }else { return reversed ;} -
当然这样的代码太繁琐,我们可以简单点一步到位
return reversed<-(2**31)||reversed>2**31-1 ? 0:reversed;
最后的结果就是:
/**
* @param {number} x
* @return {number}
*/
var reverse = function(x) {
const result1=parseInt(Math.abs(x).toString().split('').reverse().join(''))*Math.sign(x);
return result1<-(2**31)||result1>2**31-1 ? 0:result1;
总结:
通过这道简单的LeetCode算法题,我们可以得出这道题目并不难,我们只是将它拆分成了许多小块,再逐一攻克,我们要学会举一反三,要通过做一道题,慢慢学会做一类题。