Leetcode 第7题 - 反转整数(easy)

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123 输出: 321

示例 2:

输入: -123 输出: -321

示例 3:

输入: 120 输出: 21

解题思路

反转整数很简单 ,我们要一次拆解 各个位数 然后每次乘以 10 把上一次加上就好了,如果是负数 我们先把 符号 截取 反转后加上。

我们需要注意的是,32位的数的取值范围是 [−2^31, 2^31 − 1],如果反转后超出 这个值返回0 。

example:

给个 b = 1024 a = 0

第一次 a = (a + b % 10) * 10 = 4 *10 =40 然后更新下 b = 1024 /10 = 102

第二次 a = (a + b % 10) * 10 = (40 + 102 % 10) * 10 = 420 然后更新下 b = 102 /10 = 10

第三次 a = (a + b % 10) *10 = (420 + 10 % 10) * 10 = 4200 然后更新下 b = 10 /10 = 1

第四次 a = (a + b % 1) *10 = (4200 + 1 % 10) * 10 = 4201 结束条件 b=1/10 =0.1 小于 1 条件结束

我们 要注意 在转换过程中,如果数字超出 范围就返回 0 ,为此 我们在 需要把数字转换成 i64 去判断下大小。

全部代码

pub fn reverse(x: i32) -> i32 {
    let mut tmp;
    if(x < 0 ){
        tmp = -x;
    }else{
        tmp = x;
    }

    let mut tmp1 = 0;
    while (tmp >= 1){
    		//转换成 i64 去判断是否溢出
        let mut tmpcalc = tmp1 as i64 + (tmp % 10) as i64 ;
        //这里当 分解到最后一位数的时候 就不要再成10了
        if tmp >= 10 {
            tmpcalc*= 10;
        }
        //判断下 是否溢出
        if  tmpcalc >  2147483648 ||  tmpcalc <  -2147483648 { return 0;}
        tmp1 = tmpcalc as i32;
        tmp = tmp / 10;
    }
    //判断 x 是正数还是负数
    if x <0{
        -tmp1
    }else{
        tmp1
    }
}

fn main() {
    println!("{}",reverse(102));
 		println!("{}",reverse(9080980));
 		println!("{}",reverse(90801290));
}
image-20200627230138093