Reverse Integer
Given a 32-bit signed integer, reverse digits of an integer.
给定一个32位有符号整数,求整数的反转数字。
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
注意:假设我们正在处理一个只能保持32位有符号整数范围内的整数的环境。出于这个问题的目的,假设你的函数在反向整数溢出时返回0。
个人思路:
将输入的32位有符号整数转换为字符串,然后使用Array.Reverse将字符串进行逆置。考虑到有符号的存在,先判断字符串中的第一个字符是否为“-”号,若是,则截取除“-”外的剩余字符串进行逆置操作;否则,直接将该字符串逆置。由于逆置操作可能会导致32位整数的溢出,故在将字符串转换成整数时使用try-catch语句进行异常的处理。
代码如下:
public int Reverse(int x)
{
string str = x.ToString();
string symbol = str.Substring(0, 1);
string left = str.Substring(1);
char[] s;
if (symbol == "-")
{
s = left.ToCharArray();
Array.Reverse(s);
string newString = "-" + new string(s);
try
{
return (Convert.ToInt32(newString)) > (Math.Pow(2, 32) - 1) ? 0 : Convert.ToInt32(newString);
}
catch (Exception)
{
return 0;
}
}
else
{
s = str.ToCharArray();
Array.Reverse(s);
string newString = new string(s);
try
{
return (Convert.ToInt32(newString)) > (Math.Pow(2, 32) - 1) ? 0 : Convert.ToInt32(newString);
}
catch (Exception)
{
return 0;
}
}
}
大神解答:
public int reverse(int x)
{
long rev = 0;
while (x != 0)
{
rev = rev * 10 + x % 10;
x = x / 10;
if (rev > int.MaxValue || rev < int.MinValue)
return 0;
}
return (int)rev;
}
分析:
首先声明一个long型变量rev,防止后面逆置的过程中产生溢出。整数逆置的思想是:先将整数x对10求余,得到个位数,再将x除以10,即去掉个位数,然后再次对新得到的数进行求余操作,最后用最先得到的余数*10加上第二次的得到而余数,这样就能得到最后两位数字的逆置,以此类推。。。每次将相加得到的和*10加上求余的结果,就可以得到整数的逆置了。
核心代码如下:
rev = rev*10 + x % 10;
x = x/10;
反思:
将整数先转换为字符串,然后再进行一系列的操作,最后又转换成整数。这样做虽然也能得到正确的结果,但无疑会增加运行的时间开销,而且从出题人的角度来看,考察点肯定是直接对整数进行逆置。