题目:
思路:
- 将int类型转换成string类字符串,使用swap模板函数来进行反转,然后返回int类型
- 每次弹出最后一个数,将其作为新数据的第一位数,以此类推
解:(不考虑环境只能存储32位的有符号函数这一限制)
-
int reverse(int x) { string str; //将int转换为string类型 stringstream iToS; iToS << x; iToS >> str; //倒转string int i; int li = 1;//从后部计时 for (i = 0; i < str.size() - li; i++) { if ('-' == str[i]) continue; swap(str[i], str[str.size() - li]); li++; } //将string转换为int stringstream sToI; sToI << str; //判断x是否越界 long long temp; sToI >> temp; if (temp > INT_MAX || temp < INT_MIN) temp = 0; x = static_cast<int>(temp); return x; }
-
int reverse(int x) { int a[10]; int i; for (i = 0; i < 10 && x != 0; i++) { a[i] = x % 10; x /= 10; } long long sum = 0; for (int j = 0; j < i; j++) { sum += a[j] * pow(10, i - j - 1); } return (sum > INT_MAX || sum < INT_MIN) ? 0 : static_cast<int>(sum); }
然而上面两种方法的时间复杂度都是O(n²)。。。
然后我去看了其他人的C++解法,有这么一则:
int reverse(int x) {
long rev = 0;
while (x) {
int pop = x % 10;
x /= 10;
rev = rev * 10 + pop;
}
return (rev > INT_MAX || rev < INT_MIN) ? 0 : static_cast<int>(rev);
}
/*作者:anql
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-c-by-anql/
来源:力扣(LeetCode)*/
这个解法能够在通过leetcode,然而当我将其放在vs2019运行时,结果不同。
举例:设x=1234567899,该程序在Leetcode上得到0,在vs2019上得到1397719729
经过调试得到,在rev * 10 + pop这一步,符号整型超越了限制(上溢和下溢)
如图:有、无符号short类型的溢出
![](https://i-blog.csdnimg.cn/blog_migrate/3ff25df4de4d653e8ae09794d44691e7.jpeg)
而rev * 10 + pop=1397719729 是 9987654321经过了几轮的重置之后得到的,因此(1)应该在这一步之前就开始检查溢出情况
(2)再加上我们之前忽略的题目的限制(我看到了有老哥提出了这一问题才注意到。。。然而我太菜了不能理解这个限制是干啥的。。。想了半天得出的结论是不能使用8字节的long long、double。。emm..前面的解法都是不正确的。。)
最后,附上官方解(链接里有思路):
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_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
/*作者:LeetCode
链接:https://leetcode-cn.com/problems/reverse-integer/solution/zheng-shu-fan-zhuan-by-leetcode/
来源:力扣(LeetCode)*/