整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
一共分类三类情况 大于0 小于0 等于零
并且将他传入vector容器 这样刚好就是颠倒的(反转)
class Solution {
public:
int reverse(int x) {
int k =x;
if(k<0){
k = abs(k);
}
else if(x == 0)
{
return 0;
}
vector<int> obj;
while (k>0)
{
obj.push_back( k % 10); //将他的各个位数传入vector 容器
k /= 10;
}
int last = 0;
int w = pow(10,double(obj.size()-1));
for(vector<int>::iterator it = obj.begin();it !=obj.end();it++){
last = last + *it * w;
w /= 10;
}
if(x<0)
{
cout<<-last<<endl;
return -last;
}
return last;
}
};
这样运行下来 ,发现内存溢出了。
刚好今天可以学习一下c++内存溢出。
题目原来有说如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
可是没有注意到。只用在最下面的代码加一个上下限的内存溢出判断就好了。
这里在推荐一个
class Solution {
public:
int reverse(int x) {
int res = 0;
while (x) {
int t = x % 10;
if (res > INT_MAX / 10 || res < INT_MIN / 10) return 0;
res = res * 10 + t;
x /= 10;
}
return res;
}
};
作者:tgs
链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/xnx13t/?discussion=HniYFu
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
其实核心思想是一样的。但他写的代码是十分精简。主要就是当x = 1时 1/12 下一次 就会跳出循环了。