赞
踩
“我们活着不能与草木同腐,不能醉生梦死,枉度人生,要有所作为。”
整数反转
今天给大家分享一下LeetCode上的一个题目——整数反转。
题目:给出一个32位的有符号整数,你需要将这个整数中每位上的数字进行反转。(难度:简单)
示例1:
输入:123输出:321
示例2:
输入:-123输出:-321
示例3:
输入:120输出:21
注意:假设我们的环境只能存储得下32位的有符号整数,则其数值范围为 [−231, 231−1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
考察内容:
如何反转整数的一位数字?
重复“弹出”x的最后一位数字,并将其“推入”到rev的后面。
“弹出”:pop=x%10;x=x/10;
“推入”:rev=rev*10+pop;
如何检查溢出?
limits.h中有表示int32最大值、最小值的长了INT_MAX和INT_MIN;
由于“推入”时rev=rev*10+pop,因此对于正数,溢出会发生在rev*10+pop时,此时一定有rev>INT_MAX/10或者rev=INT_MAX/10&pop>7;
负数同理。
代码实现(C++)
class Solution {public: int reverse(int x) { int rev = 0; while(x != 0) { int pop = x % 10; x /= 10; if(rev > INT_MAX/10 || (rev == INT_MAX/10 && pop > 7)) { return 0; } if(rev < INT_MIN/10 || (rev == INT_MAX/10 && (pop < -8))) { return 0; } rev = rev * 10 + pop; } return rev; }};
复杂度分析
时间复杂度:O(log(x))
空间复杂度:O(1)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。