leetcode.windliang.cc/ 第一时间发布java
很简单,就是输入整数,输出它的倒置。spa
第一反应就是, 取余获得个位数,而后除以 10 去掉个位数,而后用一个变量保存倒置的数。3d
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
rev = rev * 10 + pop;
}
return rev;
}
复制代码
而后彷佛不是那么理想。code
为何呢?倒置过来不该该是 9646324351 吗。其实题目里讲了,int 的范围是 $$[-2^{31} ,2^{31}-1]$$ 也就是 $$[-2147483648,2147483647] $$ 。明显 9646324351 超出了范围,形成了溢出。因此咱们须要在输出前,判断是否溢出。cdn
问题的关键就是下边的一句了。blog
rev = rev * 10 + pop;leetcode
为了区分两个 rev ,更好的说明,咱们引入 temp 。get
temp = rev * 10 + pop;it
rev = temp;io
咱们对 temp = rev * 10 + pop; 进行讨论。intMAX = 2147483647 , intMin = - 2147483648 。
对于大于 intMax 的讨论,此时 x 必定是正数,pop 也是正数。
对于小于 intMin 的讨论同理。
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 ) return 0;
if (rev < Integer.MIN_VALUE/10 ) return 0;
rev = rev * 10 + pop;
}
return rev;
}
复制代码
时间复杂度:循环多少次呢?数字有多少位,就循环多少次,也就是 $$log_{10}(x) + 1$$ 次,因此时间复杂度是 O(log(x))。
空间复杂度:O(1)。
固然咱们能够不用思考那么多,用一种偷懒的方式 AC ,咱们直接把 rev 定义成 long ,而后输出前判断 rev 是否是在范围内,不在的话直接输出 0 。
public int reverse(int x) {
long rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
rev = rev * 10 + pop;
}
if (rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE ) return 0;
return (int)rev;
}
复制代码
比较简单的一道题,主要是在考判断是否是溢出,又是轻松的一天!