输入 32-bit int
输出 reverse digit
注意事项:只能保存整数
reverse之后溢出返回0
1534236469 revrs 之后溢出
int reverse(int x) { int y = x; int resInt = 0; int revrsInt = 0; while(0 != y){ resInt = y % 10; if( x > 0 && 2147483647 - 1 - resInt - revrsInt*10.0 <0 || x < 0 && -resInt - revrsInt* 10.0 - 2147483648 > 0 ) return 0; revrsInt = resInt + revrsInt*10 ; y /= 10; } return revrsInt; }
|
效率并不高,初步判断是溢出检查太慢的锅。
4ms范例
static const auto SpeedUp = []{ ios :: sync_with_stdio(false); cin.tie(NULL); return 0; }();
reverse(int x) { longlong… }
|
前面那个没见过,不知道怎么提升的速度。
查资料:这个函数是一个是否兼容stdio的开关,c++为了兼容C,因此将std::cout和std::printf绑定在了一起,因此将stdio解除绑定,可以大大提高IO的速度。没有必要用,现在重点是算法,但是可以当一个小技巧。
然后反转我佛了,说好的只能用int存呢?0分0分
只能找慢一点的
8ms范例
while pop = x% 10; x /= 10; if(result > MAX || (result == MAX && pop > 7 )) return 0; if(result < MIN || (result == MIN && pop < -8)) return 0; result = result * 10 + pop
|
官方解释
幸运的是,检查是否导致溢出很容易 首先假设revrsInt 为正数 那么:
那么一定有revrsInt >= INTMAX / 10
那么 resInt > 7 则相加溢出
|
最后两种方法:
8s 和 官方
//官方 if (revrsInt > INT_MAX/10 || (revrsInt == INT_MAX / 10 && resInt > 7)) return 0; if (revrsInt < INT_MIN/10 || (revrsInt == INT_MIN / 10 && resInt < -8)) return 0;
//8s #define MAX 214748364 #define MIN -214748364 if(revrsInt > MAX || (revrsInt == MAX && resInt > 7 )) return 0; if(revrsInt < MIN || (revrsInt == MIN && resInt < -8)) return 0;
//其实吧,两种表述殊途同归,只是8s的版本不用每次都除以10,只是将除法之后的结果计算出来了,所以快了一点,而官方的胜在好理解,将最大除以10,然后看余数的大小是否满足溢出条件,因此判断是否溢出。
|
最终代码
#define MAX 214748364 #define MIN -214748364 static const auto SpeedUp = []{ ios :: sync_with_stdio(false); cin.tie(NULL); return 0; }();
class Solution { public: int reverse(int x) { int resInt = 0; int revrsInt = 0; while(0 != x){ resInt = x % 10; x /= 10; if(revrsInt > MAX || (revrsInt == MAX && resInt > 7 )) return 0; if(revrsInt < MIN || (revrsInt == MIN && resInt < -8)) return 0; revrsInt = resInt + revrsInt*10 ; } return revrsInt; }
|