给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路:看到这道题,第一反应so easy,我直接把int 变成string 来进行反转,最后再变成int ,然后比较是否溢出不就完事了,以为
20分钟就能结束的,结果搞了1个小时,唉基础都快忘完了。这里有个坑得注意,就是int反转后的数可能很大普通的long都存不下,当时在这个坑上,搞了好久后来用个int_fast64_t来解决的。
然后看来官方题解后,我哭了官方答案直接在整数上进行反转根本没有用string,代码只有几行。值得安慰的是我的耗时和官方的一样都是20ms。不过评论有位大兄弟12ms真的快。刷题之路漫长希望自己能坚持下去啦-_-.
/************************************************************************
*
* 文件名:整数反转.cpp
*
* 文件描述:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
* 创建人: fdk
* 时 间: 2019-01-08
*
* 版本号:1.0 思路很简单,先把一个int型的整数转换成string类型然后通过string
* 类型来进行反转,最后再把string类型转成整数类型,然后判断是否
* 溢出
*
* 修改记录:
*
************************************************************************/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
#include<sstream>
#include<limits.h>
#define max 100
using namespace std;
/*转换函数*/
int reverse(int x);
int main()
{
/*输入调用转换函数*/
int x;
cin >> x;
cout << "result:"<<reverse(x);
return 0;
}
int reverse(int x)
{
/*判断是否为正数*/
bool isPositive = true;
if (x < 0)
{
/*如果为负数取其绝对值进行转换最后再加上负号*/
isPositive = false;
x = abs(x);
}
/*通过输入输出流来进行转换---->把int转换为string*/
ostringstream stream;
stream << x;
string str = stream.str();
int size = str.size();
string temp;
int j = 0;
for (int i = size - 1; i >= 0; i--)
{
/*进行反转操作,temp为反转后的string字符*/
temp += str[i];
}
/*这里将反转后的string类型在转成整数类型,这里有一点需要注意,
转换后的数可能很大,普通的整形可能装不下,比如1534236469
转后为964324351超出了范围因此需要找个位数大的来接受转换后的数
*/
int_fast64_t num = atol(temp.c_str());
stringstream stream2(temp);
stream2 >> num;
/****************************************************/
//自己实现先从string转换到数字类型
// int_fast64_t num = 0;
// //cout << "LONG_MAX :"<<LONG_MAX << endl;
// for (int i = 0; i < temp.size(); i++)
// {
// num *= (long)(10);
// num += (temp[i] - '0');
// }
// cout << endl << "num: " << num << endl;
/****************************************************/
if (!isPositive)
{
/*如果之前的数为负数,这里要把转换后的数加上负号*/
num = ~num + 1;
}
/*如果反转后的数还在int类型范围内则输出否则返回0*/
if ((INT_MIN <= num) && (num <= INT_MAX))
{
return num;
}
else
{
return 0;
}
}