题目来源力扣第七题,链接:https://leetcode-cn.com/problems/reverse-integer
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
解题思路:
1. 设输入为 “123”
2. 每次取最后一位数据进行计算(结果加上其数值与权值相乘)然后加上其结果,如上例中,
2.1 取 ”123“中的”3“,3 * 100 = 300
2.2 取”123“中的”2“, 2 * 10 =20
2.3 取”123“中的”1“, 1 * 1 = 1
故结果为:300 + 20 + 1 = 321
3. 实时判断数据是否溢出,若溢出返回0
3.1 实时判断结果值是否大于INI_MAX/10 或小于 INI_MIN/10,如达到此条件则需要留意数据是否还有下一位,如有则可判断为溢出。
3.2 实时判断结果值是否等于INI_MAX/10或INI_MIN/10, 如达到此条件则需要考虑数据下一位是否有,若有,是否大于7或者小于-8,若是,则溢出返回0。
代码:
#include <iostream> #include <climits> using namespace std; class Solution { public: int reverse(int x) { int result(0); while (x!=0) { if (result > INT_MAX / 10 || (result == INT_MAX && x > 7)) { return 0; } if (result < INT_MIN / 10 || (result == INT_MIN && x < -8)) { return 0; } result *=10; // 每取出一位数,则提升之前所有已取出位数的权值 result += x % 10; // 取出最后一位数,并加到结果中 x /= 10; // 舍去已添加位数 } return result; } }; int main() { Solution solution; int eg0(2147483647), eg1(1463847412), eg2(-123456); cout << "eg0: " << solution.reverse(eg0) << endl; cout << "eg1: " << solution.reverse(eg1) << endl; cout << "eg2: " << solution.reverse(eg2) << endl; return 0; }
输出:
eg0: 0
eg1: 2147483641
eg2: -654321
后
学习了一下他人的代码发现,自己身体不清,考虑不周。由于题目中假设环境中只能存储32位数据,故无论输入数据还是输出数据均只能为32位数据,故无需做 上述中3.2的判断。若结果前九位的值未超过INI_MAX以及未小于INI_MIN的值,则无需判断第十位是否溢出,因为,其值只能在 -2 ~
2 之间
代码修改:
#include <iostream> #include <climits> using namespace std; class Solution { public: int reverse(int x) { int result(0); while (x!=0) { if (result > INT_MAX / 10) { return 0; } if (result < INT_MIN / 10) { return 0; } result *=10; result += x % 10; x /= 10; } return result; } }; int main() { Solution solution; int eg0(2147483647), eg1(1463847412), eg2(-123456); cout << "eg0: " << solution.reverse(eg0) << endl; cout << "eg1: " << solution.reverse(eg1) << endl; cout << "eg2: " << solution.reverse(eg2) << endl; return 0; }
输出:
eg0: 0
eg1: 2147483641
eg2: -654321