LeetCode整数反转 | 算法练习系列

622 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

前言

整数翻转是一道非常经典的算法小题,在日常的工作中可能不会遇到这样的业务,但是解决这种问题的思想非常重要,解决的方法有很多,下面和大家分享一下我解决这个算法的方法

题目描述

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

如果反转后整数超过32位的有符号整数的范围[−2^31,  2^31 − 1] ,就返回0。

假设环境不允许存储64位整数(有符号或无符号)。

示例 1:

输入:x = 123

输出:321

示例 2:

输入:x = -123

输出:-321

示例 3:

输入:x = 120

输出:21

示例 4:

输入:x = 0

输出:0

解题思路

  • 这个问题解决的方法有很多,比如拿输入的参数通过数学的方法进行取余进行计算,然后把得到的余数倒着拼在一起,但我个人在接触这种题目的时候比较喜欢转换成字符串来解决问题
  • 可以将拿到参数通过toString转换成字符串,再利用字符串的split方法转换成数组,然后通过for循环来翻转,再把得到翻转之后的结果通过parseInt转换成数字,再处理特殊的情况就行了,记得把特殊情况做处理(也就是输入负数和0的情况,以及输入数据超过范围的情况)
  • 虽然用for循环可以解决问题,但还有更简单的方法,前面的步骤的和上面相同,for循环的操作我们可以直接用数组的reverse()来代替,这样可以很大程度的减少代码量,同时看起来也更高级

代码如下:

/**
 * @param {number} x
 * @return {number}
 */
var reverse = function(x) {
    var sign= '-'
      if(x>0){
        sign=0   
      }
        x = x.toString()
        x = x.split('').reverse()
        x = x.join('')
        x=parseInt(x)
        if(sign+x < -(2**31) ||sign+x > 2**31 -1 ){
            return 0
        }
        else{
            return sign+x
        }
};

注意:一定要记得考虑那些特殊情况,特别是对负数的处理以及对超过范围的那些数的处理,要不提交LeetCode就会出错哦。如果你思路足够清晰,完全可以把代码精简为如下:

/**
 * @param {number} x
 * @return {number}
 */
 var reverse = function(x) {
    var sign= '-'
      if(x>0){
        sign=0   
      }
        x = x.toString().split('').reverse().join('')
        x=parseInt(x)
        if(sign+x < -(2**31) ||sign+x > 2**31 -1 ){
            return 0
        }
        else{
            return sign+x
        }
};

这样是不是看起来更舒服了,在LeetCode的提交运行结果也还行,如下图:

整数翻转.PNG

总结

数字,数组和字符串在我们的生活和工作中都是接触很多的,虽然这个题目很简单,但重要的是懂其中的道理,一定还有更好,更快的方法,欢迎大家赐教。