原题目链接:
https://leetcode.com/problems/reverse-integer/description/
题目描述:
反转一个整数的数位。
实例:
x = 123,return 321
x = -123,return -321
注意:
输入假定为32位有符号整数。当反转的整数溢出时,您的函数应返回0。
除了题目给出的限制,还应该考虑诸如:10,10000等尾数含有0的数字反转后的情况。
为了解决这个题目,我主要分为几个步骤完成代码:
1.提取符号,为了避免负数在运算时的干扰,先把符号(也可能没有)提取出来,再最后的返回结果乘回去。
2.提取每一位上的数字,从尾部开始通过不断%10的方法提取,并存入一个队列中,这样通过队列出来的数字恰好是按照翻转的顺序排列。
3.将队列中的数字序列组合成翻转后的整数,并且每步运算都要先经过溢出检测才会保存在临时的结果中,否则直接返回0
以下是代码实现:
#include<queue>
class Solution {
public:
int reverse(int x) {
int flag = (x < 0) ? -1 : 1;
x = (x < 0) ? (-1 * x) : x;
queue<int> q;
while (x != 0) {
int mod = x % 10;
x = x / 10;
q.push(mod);
}
int t_result = 0;
while (!q.empty()) {
int temp = t_result * 10 + q.front();
if (t_result == (temp - q.front()) / 10) {
t_result = temp;
}
else {
return 0;
}
q.pop();
}
return t_result * flag;
}
};
代码提交结果:
看上去时间复杂度不错……
个人认为这次题目的主要难点不是如何翻转数字而是判断数字的溢出,虽然说这是一个看上去很基础的知识,但我还是第一次用到,私认为是一次很有意义的学习过程。