7. 整数反转

本文介绍了一种方法,用于反转一个32位有符号整数的每一位数字,同时考虑了整数溢出的问题。通过将整数转换为字符串进行反转,再转换回整数类型,并使用int_fast64_t类型避免溢出,最后检查反转后的整数是否在32位有符号整数的范围内。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给出一个 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;
	}
}















 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值