问题描述:
翻转整数,当超出32位整数的表示范围时,返回0。
Reverse digits of an integer. Returns 0 when the reversed integer overflows (signed 32-bit integer).
示例:
输入:123,输出:321;输入:-123,输出:-321。
思路一:使用可变长度的vector容器存放“输入数值的每一个十进制位”,翻转存放各位数,即个位存在数组的第1个位置,十位存在数组的第2个位置,依次类推。根据vector<int>容器的大小,计算十进制数各位需要乘的幂次。用long long int暂时存放最终翻转后数的绝对值,如果超过32位整数的范围,则中断,并返回0。
空间代价:vector<int>数组,及其迭代器,表示数正负的标志bool,暂存结果的long long int型整数。
代码调试阶段碰到的bug:
(1)输入:-10,输出-10?,输出应为-1。
代码第一条判断,必须是“输入数值的绝对值”只有个位数,直接返回,之前忘加abs操作。
存放翻转结果的数组内,前面可能含有“无效的0”,需要去掉。
(2)输入:1534236469,输出:-1501159297?,输出应为0。
翻转后的数超出32位有符号整数的范围。暂时通过暂存结果变成long long int,并加范围判断来规避这一问题。
代码如下:
int reverseInteger(int n) {
// write your code here
if (abs(n/10) < 0 ) return n;
if (n>INT_MAX || n<INT_MIN) return 0;
bool flag = 0;
if (n<0) {
n = abs(n);
flag = 1;
}
vector<int> r;
while(n) {
r.push_back( n%10);
n = n/10;
}
int rs = r.size();
// remove useless prior zeros
for (int i=0; i<rs; i++)
{
if (r[i] == 0)
{
r.erase(r.begin()+i);
i--;
rs = rs-1;
}
else {
break;
}
}
long long int res = 0;
for (int i = 0; i < rs; i++) {
res += r[i]*pow( 10,(rs-i-1) );
if (res>INT_MAX) return 0;
}
if (flag==1) res = - res;
if (res>INT_MAX || res<INT_MIN) return 0;
return int(res);
}
思路二:定义一个整数整数翻转后的结果,直接将原整数从个位数开始,边存入临时结果,并乘以10,边逐位地往前迭代。
参考:https://cloud.tencent.com/developer/article/1403065
代码如下:
/**
* @param n: the integer to be reversed
* @return: the reversed integer
*/
int reverseInteger(int n) {
long res = 0;
while (n != 0) {
res = res * 10 + n % 10;
n /= 10;
if (res > INT_MAX || res < INT_MIN) return 0;
}
return (int)res;
}