题意思路:
一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
翻转可能会导致溢出,如果反转后的结果会溢出就返回 0。
方法一:暴力法
可以将数字从最低位向最高位枚举得到反转数字ans存储于long long ,然后将ans强制类型转换为int。
若ans转换的数字与long long类型不相等则发生溢出,
否则则没有发生溢出,
要记得处理数字小于零的情况;
复杂度分析:
时间复杂度:O(m),m为数字长度,遍历数字各位的数字。
空间复杂度:O(1);存储与读取数据
图文详解:
翻转每一位数字即可,原理比较简单,我们直接来看图分析;
标程:
class Solution { public: int reverse(int x) { long long ans=0; bool flag=0; if(x<0)flag=1;//如果为负数要记得转换 while(x){//从最低位依次枚举 ans*=10;//先乘后加 ans+=x%10; x/=10; }//x等于0则表示结束 if(flag)x*=-1;//强制类型转换比较得到答案 if(ans!=(int)ans)return 0; else return ans; } };
方法二:通过字符串处理
将x数字转换为字符串处理,然后依次从右向左枚举字符,实现数字的反转。
若ans转换的数字与long long类型不相等则发生溢出,
否则则没有发生溢出,
要记得处理数字小于零的情况,注意字符与数字转换;
复杂度分析:
时间复杂度:O(m),m为数字长度,遍历数字各位的数字。
空间复杂度:O(m);存储与读取数据
标程:
class Solution { public: int reverse(int x) { string s; long long ans=0; s=to_string(x);//将x数字转换为字符串处理 for(int i=s.size()-1;i>=0;i--){//从右到左枚举每一位字符 if(s[i]=='-')ans*=-1;//如果字符等于负号,将ans表示为负数 else ans*=10,ans+=s[i]-'0';//如果为数字则ans依次增加,先乘后加 }//注意字符与数字转换 if(ans==(int)ans)return ans;//强制类型转换比较 else return 0; } };