题目来源:LintCode
原题地址:http://www.lintcode.com/zh-cn/problem/reverse-integer/#
题目:
将一个整数中的数字进行颠倒,当颠倒后的整数溢出时,返回 0 (标记为 32 位整数)。
您在真实的面试中是否遇到过这个题?
Yes
样例
给定 x = 123
,返回 321
给定 x = -123
,返回 -321
难度级别:
容易
容易
思路分析:
这个题目本身的做法是很简单的,数字的首尾颠倒就可以了。
如果是纸上写的话,我想应该受过小学教育的人都是会的。
但是这里要用程序来实现,那么我们知道,计算机的计算位数是有限的,整数的范围是从-2147483648~2147483647的,
这个题目本身的做法是很简单的,数字的首尾颠倒就可以了。
如果是纸上写的话,我想应该受过小学教育的人都是会的。
但是这里要用程序来实现,那么我们知道,计算机的计算位数是有限的,整数的范围是从-2147483648~2147483647的,
如果超出这个范围的话,返回的是0;
那么什么时候回超出这个范围呢?这是这个题的关键之处。直接去采用整数似乎不是那么好把握的,因此为了简单起见,
我采用的是,直接将数字转换成字符串来操作。
这样写的程序比较冗长了一点,但是实际的思路就会变得简单起来。
我不需要考虑,我翻转的数字,在翻转的过程中是否会超出范围,我也不用担心当超出范围的时候,不清楚具体位置。
我只要判断出是否是负数,是否在区间内,通过字符串判断也是十分方便的。
那么什么时候回超出这个范围呢?这是这个题的关键之处。直接去采用整数似乎不是那么好把握的,因此为了简单起见,
我采用的是,直接将数字转换成字符串来操作。
这样写的程序比较冗长了一点,但是实际的思路就会变得简单起来。
我不需要考虑,我翻转的数字,在翻转的过程中是否会超出范围,我也不用担心当超出范围的时候,不清楚具体位置。
我只要判断出是否是负数,是否在区间内,通过字符串判断也是十分方便的。
实现代码:
#include <iostream>
using namespace std;
//#define IntMax 2147483647
//#define IntMin -2147483648
class Solution
{
public:
/**
* @param n the integer to be reversed
* @return the reversed integer
*/
int reverseInteger(int n)
{
char ch[100];
sprintf(ch, "%d", n);
int cnt = 0;
while (ch[cnt] != '\0')
{
cnt++;
}
//cout << cnt << endl;
int i = 0, j = cnt - 1;
if ('-' == ch[i]) //判断是否是负数
{
i++;
}
char tmp;
while (i < j) //数据颠倒
{
tmp = ch[i];
ch[i] = ch[j];
ch[j] = tmp;
i++; j--;
}
i = 0; //指针重新指向最前端
if ('-' == ch[i])
{
//判断是否小于最小值-2147483648
char intMin[] = "-2147483648";
i++;
if (cnt == 11)
{
while (ch[i] != '\0')
{
if (intMin[i] > ch[i])
{
break;
} else if (intMin[i] < ch[i])
{
return 0;
} else
{
i++;
}
}
}
} else
{
//判断是否大于最大值 2147483647
char intMax[] = "2147483647";
if (cnt == 10)
{
while (ch[i] != '\0')
{
if (intMax[i] > ch[i])
{
break;
} else if (intMax[i] < ch[i])
{
return 0;
} else
{
i++;
}
}
}
}
sscanf(ch, "%d", &n);
return n;
}
};
代码说明:
需要注意的是,判断是否在区间中的时候,我先判断了超出的可能性,如果是负数的话,只有数字字符是11位时才有可能,多出来的一位是负号;
如果是正数的话,数字字符是10位时才有可能。其他的位数(只会小,不会大的)都不可能有超出的可能性。
需要注意的是,判断是否在区间中的时候,我先判断了超出的可能性,如果是负数的话,只有数字字符是11位时才有可能,多出来的一位是负号;
如果是正数的话,数字字符是10位时才有可能。其他的位数(只会小,不会大的)都不可能有超出的可能性。