7. Reverse Integer
知识点
1.字符串倒置
#include <cstring> #include <algorithm> int main() { string str1; cin>>str1; cout<<"原始字符串是:"<<str1<<endl; reverse(str1.begin(),str1.end()); cout<<"转换后的字符串是:"<<str1<<endl; return 0; }
2.string转int
string num; int tmp = stoi(num);
错误示范
class Solution { public: int reverse(int x) { while (x % 10 == 0 &&x) { x /= 10; } if (x<-pow(2,31)||x>pow(2,31)-1) { return 0; } string num = to_string(x); std::reverse(num.begin(), num.end()); char tmp = *(num.end() - 1); cout<<x; x = stoi(num); if (tmp=='-') { return -1*x; } return x; } };
这种解法的失败之处在于先转字符串,再字符串转整型时会有溢出的问题,题目说了整数超过32位的有符号整数的范围 [−231, 231 − 1],就返回0。所以要考虑输入1534236469在范围内,可倒置后9646324351就溢出了。
1.白痴解法
class Solution { public: int reverse(int x) { cout << x << endl; while (x % 10 == 0 && x) { x /= 10; } if (x < -pow(2, 31) || x > pow(2, 31) - 1) { return 0; } string num = to_string(x); std::reverse(num.begin(), num.end()); cout << "num:" << num << endl; char tmp = *(num.end() - 1); long int y = atol(num.c_str()); cout << y; if (y < -pow(2, 31) || y > pow(2, 31) - 1) { return 0; } if (tmp == '-') { return -1 * y; } return y; } };
将string转换成long类型,不齿的通过了。解法过于暴力。
进阶解法
int reverse(int x) { long result = 0; while(x != 0) { result = result*10 + x % 10; x /= 10; } return (result > INT_MAX || result < INT_MIN)? 0 : result; }
这种解法通过数学方法倒置了数字,然后用long类型存储,判断用long类型存储的数字是否溢出。
标准解法
class Solution { public: int reverse(int x) { int rev = 0; while (x) { int pop = 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; } x /= 10; rev = rev*10+pop; } return rev; } };
32位有符号整数,最大2147483647,最小-2147483648
就是要注意判断条件,当没算最后一位时,该数大于INT_MAX/10或者最后一位大于INT_MAX范围,则判断为溢出。
感悟
要多思考数学方法,不要一碰到数字题目首先想到的是转字符串。