LeetCode第七题
题目描述:
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
思路
采用除以10和取余操作,获取反转的数字。为了使程序过程更清晰,创建一个数组,用来存储反转数的每位数值。再循环乘以基的各次方累加,就得到了目标值。最后将得到的值与int型最大最小值比较,若溢出则将目标值置0。然后返回目标值即可。
源代码
int reverse(int x){
int nums[11] = {0}; //32位有符号整数化为十进制不超过11位,此数组存储反转数的每位数值
const int mod = 10; //将模10定义为const类型
int num = x; //num为每次遍历剩下未处理的数
int i = 0,j = 0;
double result = 0; //结果值定义为double型,防止值溢出int型而报错
while(num != 0){
nums[i] = num % mod;
num /= mod;
++i;
}
double sub = 1; //以10为基,防止值溢出int型而报错
if(i > 0){
for(j = i - 1,sub = 1;j >= 0;--j,sub *= mod){
result += nums[j] * sub;
}
}
if(result > 2147483647 || result < (-2147483648)){
result = 0;
}
return result;
}
分析
时间复杂度为线性级别,空间复杂度为常数级别。
然而数组的创建不是必须的,可以在while循环内部就将result累加起来。这样代码会更加简洁。