吊打力扣第7题的整数反转,各个击破,教你如何举一反三

175 阅读2分钟

前言:

相信很多同学在看到算法的时候都会两眼发黑,觉得明明就是很简单的小学生应用题,但却非要你用一种极其复杂的方法去解题。因此,很多同学面对算法无从下笔,算法也就成了很多同学的噩梦。所以今天,我们一起来到LeetCode的第7题-整数反转的奥秘。我们要将算法的难点,复杂点各个击破,学会举一反三。 image.png

一.弄清题目需求,分清题目具体问什么?

从下面这张图片我们可以看出题目给我们一个有效整数x,将这个整数翻转(只是数字部分),那么我接下来详细剖析这个问题的特别之处:

image.png

                        // 输入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);

二.检查题目注意事项,范围条件

微信图片_20250705092157.png 从上面这张图片我们可以看出:

  • 题目所给出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算法题,我们可以得出这道题目并不难,我们只是将它拆分成了许多小块,再逐一攻克,我们要学会举一反三,要通过做一道题,慢慢学会做一类题。