LeetCode Hot100【7. 整数反转】
7. 整数反转
自己做
解1:求数累加
【LeetCode中不允许溢出操作,要在溢出前判断是否溢出】
class Solution {
public:int reverse(int x) {//cout << x << endl;int reverse_x = 0; //反转数int number; //x的位数【10的多少次方可以取出x】int div_num = 1; //除数int multi_num = 1; //乘数//首先判断x有多少位【2的10次方是1024】for (int i = 1; i <= 10; i++) { if ((x == std::numeric_limits<int>::min() && div_num == 1)) { //最小值的边界情况【div要从10开始,比如又会报错】}else if (abs(x / div_num) < 10) { //找到对应位数,退出循环【为防止除数越界,不用等于0的判断】number = i; break;}div_num *= 10;}//求出各位数字for (int i = 0; i < number; i++) {//判断乘法溢出,迎合LeetCode,LeetCode不允许出现溢出//if (multi_num > std::numeric_limits<int>::max() / 10 && x > 0)// return 0;//if (-multi_num < std::numeric_limits<int>::min() / 10 && x < 0) {// return 0;//}int old = reverse_x;int add = (x / div_num) % 10 * multi_num; //累加的数reverse_x += add; //不会溢出则累加//判断结果是否溢出,溢出了就直接返回0if (reverse_x % multi_num != old)return 0;div_num /= 10;//迎合LeetCode,LeetCode不允许溢出操作if (i != number -1)multi_num *= 10;}return reverse_x;}
};
看题解
题解和我反着来,累加的数一直是个位的,这样就避免了溢出的问题(判断下个数是否溢出)
class Solution {
public:int reverse(int x) {int res = 0;while (x != 0) {int temp = x % 10;if (res > std::numeric_limits<int>::max() / 10 || (res == std::numeric_limits<int>::max() / 10 && temp > 7))return 0;if (res < std::numeric_limits<int>::min() / 10 || (res == std::numeric_limits<int>::min() / 10 && temp < -8))return 0;res = res * 10 + temp;x /= 10;}return res;} };
今日总结
LeetCode判题确实严格,一点溢出都不能有,如果不考虑溢出,应该挺简单的