这是我参与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的提交运行结果也还行,如下图:
总结
数字,数组和字符串在我们的生活和工作中都是接触很多的,虽然这个题目很简单,但重要的是懂其中的道理,一定还有更好,更快的方法,欢迎大家赐教。