Leetcode 第9题 - 回文数(easy)

题目:判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:

输入: 121
输出: true

示例 2:

输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

编码实现思路

Leetocde模板代码:


#![allow(unused_variables)]
fn main() {
impl Solution {
    pub fn is_palindrome(x: i32) -> bool {
        

    }
}
}

实现思路

这里我们先要熟悉,一个基本操作 一个数数 取个位只需要取余( % 10)

101 % 10 = 1

如果要把每一位 取出来 就需要 循环 /10 %10

pub fn takenum(x: i32) {
   let mut tmp = x;
    while tmp >1 {
        print!("{} ",tmp%10);
        tmp = tmp /10;
    }
    println!();

}

fn main() {
    takenum(543);
}

leetcode给定的是 一个 i32数字,我们的思路是这样的 把 一个数字 比如 123 -> 反转 成 321 如果判断反转后的数字,和原数字相等 那么 就是回文数字。

example : 121 ->

tmp1 = 取个位1 * 10 = 10

tmp1 += 取十位2 * 10 = (tmp1 + 2) * 10 = (10 +2) * 10 =120

tmp1 += 取百位1 * 10 =(tmp1 + 1) * 10 = (120 +2) * 10 =1210

最后 tmp1 /10 = 121

反转一个整数

example : 123 -> 321 121->121

pub fn reverse(x: i32) -> i32{
    let mut tmp = x;
    let mut tmp1 = 0;
    while (tmp >= 1) {
            // 123 第一次  temp1 30 tmp 12 -> 第二次 320 1 -> 第三次 3210 0.1 小于1 跳出循环 这样就完成了颠倒数字
        tmp1 = (tmp1 + tmp % 10 )* 10;
        tmp = tmp / 10;
    }
    tmp1 /10

}

fn main() {

    println!("{}",reverse(123));
}

回文数字完整代码

有了上面的反转,只需要判断下 反转后的代码是否与原文一致即可,但是下面代码 还对 某些特殊的数字 比如负数、能被10整除的数、0~10的数字 直接做出判断、做了一些特殊条件的处理。

pub fn is_palindrome(x: i32) -> bool {
    // [0,10)之间的数 都为 true
    if(x < 10 && x >=0){return true;}
    //如果 -开头的 和 100、1000 这样的直接排除
    if(x < 0 || x % 10 ==0 ){ return false }
    let mut tmp = x;
    let mut tmp1 = 0;
    while (tmp >= 1) {
        //将数字颠倒  123 先取出 3* 10 在把tmp更新成 12
       //这里加 if 是因为 如果是10位数 最后一次个位数再乘以10 -> 11位数 就超出 i32 的最大值了 就会报错!
        if  tmp < 10 { tmp1 = (tmp1 + tmp % 10 )}
        else{
            // 123 第一次  temp1 30 tmp 12 -> 第二次 320 1 -> 第三次 3210 0.1 小于1 跳出循环 这样就完成了颠倒数字
            tmp1 = (tmp1 + tmp % 10 )* 10;
        }
        tmp = tmp / 10;
    }
    //123 -> 321 不相等 121 -> 121 相等
    if tmp1 == x {
        return true;
    }
    return false;
}

//测试代码
fn main() {
    println!("{}",is_palindrome(123));
    println!("{}",is_palindrome(121));
    println!("{}",is_palindrome(1000000001));

}

提交结果:

image-20200623143110412

ps:点击编辑器右上角 图标可运行代码哦!

image-20200623170053603