leetcode assignment2
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
最初的想法
class Solution {
public int reverse(int x) {
int hundred = x / 100;
int ten = x % 100 / 10;
int one = x % 10;
int reverseNumber = one*100+ten*10+hundred;
if(reverseNumber>=(-Math.pow(2,31)) && reverseNumber<=(Math.pow(2,31)-1)){
return reverseNumber;
}else{
return 0;
}
}
}
这个代码只能解决三位数的转换,是我鼠目寸光了。想要更灵活,就不能写死
方法改进
class Solution {
public int reverse(int x) {
int result = 0;
while(x!=0){
int pop = x % 10;
x /= 10;
if(result>Integer.MAX_VALUE/10 || result==Integer.MAX_VALUE/10&&pop>7){
return 0;
}
if(result<Integer.MIN_VALUE/10 || result==Integer.MAX_VALUE/10&&pop<-8{
return 0;
}
result = 10 * result + pop;
}
return result;
}
}
分析
我每次用x模10,就能得到数字的最后一位,在while循环中没循环一次将上一次得到的数字乘10,再加上模出的值,就形成了逆序。
在判断数组越界时,看的是result = 10 * result + pop;这一语句是否越界。因为result是int类型的,所以10 * result + pop要<=Integer.MAX_VALUE,>=Integer.MIN_VALUE。所以判断语句为result>Integer.MAX_VALUE/10或result==Integer.MAX_VALUE/10&&pop>7。另一个判断类似。
时间复杂度
复杂度分析
时间复杂度:O(log(x)),xx 中大约有 log10(x)位数字。
空间复杂度:O(1)。
疑问
- 为什么等于的时候要有pop>7呢?难道一个int占8位,如果=8就要+1??
答:因为int的范围是-2147483648到2147483648,所以在
result==Integer.MAX_VALUE/10&&pop>7
这一语句中Integer.MAX_VALUE==2147483648/10 == 214748364,若pop大于7即pop=8时,达到上界。下界同理。
2. 为什么1534236469的逆序预期为0,他也没超-2147483648到2147483648呀?
答:因为我比较的范围是逆序后的范围,逆序为8463847412,远远超出了界限
3. 为什么1534236470的逆序是746324351??
答:因为个位数是0,所以逆序后很小
4. 为什么是7和-8,等于8不也没超吗?只是相等了呀。
答:我改成了>8,<-9。答案也对,而且速度更快内存占用更小,我懵了,标准答案和我这个范围可是有区别的,我搞不太懂了。。。