Lintcode 反轉整數
阿新 • • 發佈:2018-12-26
題目
將一個整數中的數字進行顛倒,當顛倒後的整數溢位時,返回 0 (標記為 32 位整數)。
樣例
給定 x = 123,返回 321
給定 x = -123,返回 -321
class Solution {
public:
/**
* @param n the integer to be reversed
* @return the reversed integer
*/
int reverseInteger(int n) {
// Write your code here
//如何判斷整數的溢位?
//如何判斷整數反轉後的溢位?是不是應該換成long
bool flag=true;
long res=0;
//輸入非法
if(n>=2147483648||n<=-2147483648)
return 0;
//反轉操作
else
{
vector<int> vec;
if(n<0)
{
flag=false;
n=-n;
}
while (n!=0)
{
//得到每一位的數字加入容器尾端
vec.push_back(n%10);
n/=10;
}
//求反轉後的數字
for(auto c:vec)
res=res*10+c;
}
//反轉之後的判斷
if(res>=2147483648)
{
return 0;
}
else if(flag==false)
return -res;
else
return res;
}
};
優化
我們可以一邊計算res的值一邊判斷res是否越界
class Solution {
public:
/**
* @param n the integer to be reversed
* @return the reversed integer
*/
int reverseInteger(int n) {
// Write your code here
//如何判斷整數的溢位?
//如何判斷整數反轉後的溢位?是不是應該換成long
long res=0;
//輸入非法
if(n>=2147483648||n<=-2147483648)
return 0;
//反轉操作
else
{
vector<int> vec;
while(n!=0)
{
//得到每一位的數字加入容器尾端
vec.push_back(n%10);
n/=10;
}
//求反轉後的數字,並判斷數字是否越界
for(auto c:vec)
{
res=res*10+c;
if(res>=2147483648)
return 0;
}
}
return res;
}
};
再優化,因為res在計算的過程中,如果發生越界,那麼得到的值/10操作肯定不會等於未加之前的值,則,res也可以宣告為int型別。
class Solution {
public:
/**
* @param n the integer to be reversed
* @return the reversed integer
*/
int reverseInteger(int n) {
int result = 0;
while (n) {
auto prev = result;
result *= 10;
result += n % 10;
if (result / 10 != prev) {
result = 0;
break;
}
n /= 10;
}
return result;
}
};