题目链接:https://leetcode.cn/problems/reverse-integer/
这个题目关键点在于反转后的数字是否越界(超出int型范围),而且还不能用long型来判断是否越界(不能存储64位整型),这个判断条件我不了解,没有推导出来((rev < INT_MIN / 10 || rev > INT_MAX / 10)),所以最后提交之后用例有几个没通过。下面这个是看了官方题解写出来的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
class Solution { public: int reverse(int x) { int rev = 0; int digit = 0; while (x != 0) { if (rev < INT_MIN / 10 || rev > INT_MAX / 10) { return 0; } digit = x % 10; x = x / 10; rev = rev * 10 + digit; } return rev; } }; |
我原来的思路(错误代码,输入x=1534236469时用例执行失败):
ps. 为啥要先转换成字符串之后再转回整数,主要是想尝试不同的解法(这道题跟之前回文数判断的题目有点类似,之前用了取模、除10得到最后一位数字的方法,这次想尝试另外的解法:http://aspirer.wang/?p=1585)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
class Solution { public: int reverse(int x) { if (x == 0) { return 0; } char str[16] = {0}; char rev[16] = {0}; char* p = str; snprintf(str, 16, "%d", x); int len = strlen(str); if (x < 0) { int i = 0; rev[i] = '-'; i++; while (len > 1) { rev[i] = str[len - 1]; len--; i++; } return atoi(rev); } else { int i = 0; while (len > 0) { rev[i] = str[len - 1]; len--; i++; } return atoi(rev); } } }; |