一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情。
一、题目描述:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例:
示例 1:
输入: x = 123
输出: 321
示例 2:
输入: x = -123
输出: -321
示例 3:
输入: x = 120
输出: 21
示例 4:
输入: x = 0
输出: 0
提示:
-231 <= x <= 231 - 1
二、题解:
这道题意在 数字部分反转, 所以得考虑如何将数字反转。
有三种简单的方法:数组自尾部push,字符串自尾部拼接和数组的方法reverse直接翻转。
这道题有三个陷阱
- 翻转前是在某个范围内的,都是存在一种可能,即翻转后越界问题
- 翻转前最后一位或几位是0,翻转后需要舍去
- 翻转前后的符合问题
方法一 字符串拼接法
- 原理。根据题解遍历放入合适的数字拼接即可。
- 思路。
- 如果为负数得先提取符号位,再规整数字(取绝对值)
- 遍历
- 利用取余提取最后一位
- 拼接字符串且跳过最后一位或几位是0的情况
- 利用除法+取整运算改变遍历的数字
- 再判断边界问题
代码:
var reverse = function(x) {
// 先排除0的特殊情况
if(x===0){
return 0
}
let resStr = ''
// 如果为负数得先提取符号位,再规整数字
if(x<0){
resStr+='-'
x = Math.abs(x)
}
// 如果x不为0
while(x){
// 利用取余提取最后一位
let item = x%10
// 如果此时resStr为空,且取余提取的数为0,则不做任何操作,跳过最后一位或几位是0的情况
if(resStr.length || item!==0) {
resStr+=item
}
// 利用除法+取整运算让x长度减少,失去最后一位
x = parseInt(x/10)
}
resStr = Number(resStr)
let bigNum = 2**31
// 翻转后的边界问题
if(resStr>bigNum-1 || resStr<-1*bigNum){
return 0
}
return resStr
}
同理可替换为数组操作:
var reverse = function(x) {
// 先排除0的特殊情况
if(x===0){
return 0
}
let resArr = []
// 如果为负数得先提取符号位,再规整数字
if(x<0){
resArr.push('-')
x = Math.abs(x)
}
// 如果x不为0
while(x){
// 利用取余提取最后一位
let item = x%10
// 如果此时resArr为空,且取余提取的数为0,则不做任何操作,跳过最后一位或几位是0的情况
if(resArr.length || item!==0) {
resArr.push(item)
}
// 利用除法+取整运算让x长度减少,失去最后一位
x = parseInt(x/10)
}
resArr = Number(resArr.join(''))
let bigNum = 2**31
// 翻转后的边界问题
if(resArr>bigNum-1 || resArr<-1*bigNum){
return 0
}
return resArr
}
方法二 巧用数组方法
- 原理。根据题解利用数组的
reverse翻转数字拼接即可。 - 思路。
- 如果为负数得先提取符号位,再规整数字(取绝对值)
- 遍历
- 拼接reverse翻转后的数字
- 再判断边界问题
- 注意。
这个方法得把数字先转化为字符串,再使用split切成数组才可
代码:
var reverse = function(x) {
if(x===0){
return 0
}
let resStr = ''
if(x<0){
resStr+='-'
x = Math.abs(x)
}
resStr += String(x).split('').reverse().join('')
resStr = Number(resStr)
let bigNum = Math.pow(2,31)
if(resStr>bigNum-1 || resStr<-1*bigNum){
return 0
}
return resStr
};
三、总结
- 此题可以字符串拼接法和巧用数组方法两种方案
- 字符串拼接法主要是根据题解遍历放入合适的数字拼接即可。
- 巧用数组方法主要是根据题解利用数组的
reverse翻转数字拼接即可。
文中如有错误,欢迎在评论区指正