Rust每日一练(Leetday0003) 整数反转、字串转整数、回文数

简介: Rust每日一练(Leetday0003) 整数反转、字串转整数、回文数

7. 整数反转 Reverse Integer


给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。


如果反转后整数超过 32 位的有符号整数的范围 [− 2^31, 2^31 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。


示例 1:

输入:x = 123

输出:321


示例 2:

输入:x = -123

输出:-321


示例 3:

输入:x = 120

输出:21


示例 4:

输入:x = 0

输出:0


提示:

   -2^31 <= x <= 2^31 - 1

代码:


use std::i32;
fn reverse(x: i32) -> i32 {
    let mut tmp = 0;
    let mut num = x;
    while num != 0 {
        tmp = tmp * 10 + num % 10;
        num /= 10;
    }
    if tmp < i32::MIN || tmp > i32::MAX {
        return 0;
    }
    tmp
}
fn main() {
    println!("{}", reverse(123));
    println!("{}", reverse(-123));
    println!("{}", reverse(120));
    println!("{}", reverse(0));
}


输出:

321

-321

21

0


8. 字符串转换整数 String-to-integer (atoi)


请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。


函数 myAtoi(string s) 的算法如下:


   读入字符串并丢弃无用的前导空格


   检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结果是负数还是正数。 如果两者都不存在,则假定结果为正。


   读入下一个字符,直到到达下一个非数字字符或到达输入的结尾。字符串的其余部分将被忽略。


   将前面步骤读入的这些数字转换为整数(即,"123" -> 123, "0032" -> 32)。如果没有读入数字,则整数为 0 。必要时更改符号(从步骤 2 开始)。


   如果整数数超过 32 位有符号整数范围 [−2^31,  2^31 − 1] ,需要截断这个整数,使其保持在这个范围内。具体来说,小于 −231 的整数应该被固定为 −2^31 ,大于 2^31 − 1 的整数应该被固定为 2^31 − 1 。


   返回整数作为最终结果。


注意:


   本题中的空白字符只包括空格字符 ' ' 。

   除前导空格或数字后的其余字符串外,请勿忽略 任何其他字符。


示例 1:

输入:s = "42"

输出:42

解释:加粗的字符串为已经读入的字符,插入符号是当前读取的字符。

第 1 步:"42"(当前没有读入字符,因为没有前导空格)

        ^

第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+')

        ^

第 3 步:"42"(读入 "42")

          ^

解析得到整数 42 。


由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42 。


示例 2:

输入:s = "   -42"

输出:-42

解释:

第 1 步:"   -42"(读入前导空格,但忽视掉)

           ^

第 2 步:"   -42"(读入 '-' 字符,所以结果应该是负数)

            ^

第 3 步:"   -42"(读入 "42")

              ^

解析得到整数 -42 。

由于 "-42" 在范围 [-231, 231 - 1] 内,最终结果为 -42 。


示例 3:


输入:s = "4193 with words"

输出:4193

解释:


第 1 步:"4193 with words"(当前没有读入字符,因为没有前导空格)

        ^

第 2 步:"4193 with words"(当前没有读入字符,因为这里不存在 '-' 或者 '+')

        ^

第 3 步:"4193 with words"(读入 "4193";由于下一个字符不是一个数字,所以读入停止)

            ^

解析得到整数 4193 。

由于 "4193" 在范围 [-231, 231 - 1] 内,最终结果为 4193 。


提示:

   0 <= s.length <= 200

   s 由英文字母(大写和小写)、数字(0-9)、' '、'+'、'-' 和 '.' 组成

代码:

use std::i32;
fn my_atoi(s: String) -> i32 {
    let mut s = s.trim().to_string();
    let mut flag = 1;
    if s.starts_with('-') {
        flag = -1;
        s = s[1..].to_string();
    } else if s.starts_with('+') {
        s = s[1..].to_string();
    }
    let mut num = 0;
    for c in s.chars() {
        if !c.is_ascii_digit() {
            break;
        }
        let digit = c.to_digit(10).unwrap() as i32;
        num = num * 10 + digit;
        if num * flag < i32::MIN {
            return i32::MIN;
        } else if num * flag > i32::MAX {
            return i32::MAX;
        }
    }
    num * flag
}
fn main() {
    println!("{}", my_atoi("42".to_string()));
    println!("{}", my_atoi("   -42".to_string()));
    println!("{}", my_atoi("4193 with words".to_string()));
}

输出:

42

-42

4193


9. 回文数 Palindrome Number


给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。


回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。


   例如,121 是回文,而 123 不是。


示例 1:

输入:x = 121

输出:true


示例 2:

输入:x = -121

输出:false

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


示例 3:

输入:x = 10

输出:false

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


提示:

   -2^31 <= x <= 2^31 - 1

进阶:你能不将整数转为字符串来解决这个问题吗?

代码:

fn is_palindrome(x: i32) -> bool {
    if x < 0 {
        return false;
    }
    if x < 10 {
        return true;
    }
    let s = x.to_string();
    let length = s.len();
    for i in 0..=length / 2 {
        if s.chars().nth(i).unwrap() != s.chars().nth(length - 1 - i).unwrap() {
            return false;
        }
    }
    true
}
fn main() {
    println!("{}", is_palindrome(121));
    println!("{}", is_palindrome(-121));
    println!("{}", is_palindrome(10));
}

输出:

true

false

false

目录
相关文章
|
6月前
|
存储 Rust 程序员
Rust中数据类型详解:从整数到字符串
本文将详细解析Rust编程语言中的基本数据类型,包括整数、浮点数、布尔值、字符与字符串。我们将深入探讨每种数据类型的特性、使用场景以及它们在Rust中的实现方式,帮助读者更好地理解和应用这些基础元素。
|
6月前
|
Java Go C++
Rust每日一练(Leetday0031) 解码方法、复原 IP 地址
Rust每日一练(Leetday0031) 解码方法、复原 IP 地址
62 0
Rust每日一练(Leetday0031) 解码方法、复原 IP 地址
|
6月前
|
Java Go Rust
Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II
Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II
87 0
Rust每日一练(Leetday0030) 合并有序数组、格雷编码、子集II
|
6月前
|
算法 Java Go
Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串
Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串
51 0
Rust每日一练(Leetday0029) 柱状图、最大矩形、扰乱字符串
|
6月前
|
Rust Java Go
Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II
Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II
60 0
Rust每日一练(Leetday0027) 单词搜索、删除重复项II、搜索旋转排序数组II
|
6月前
|
Java Go C++
Rust每日一练(Leetday0026) 最小覆盖子串、组合、子集
Rust每日一练(Leetday0026) 最小覆盖子串、组合、子集
64 0
Rust每日一练(Leetday0026) 最小覆盖子串、组合、子集
|
6月前
|
算法 Java Go
Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类
Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类
68 0
Rust每日一练(Leetday0025) 矩阵置零、搜索二维矩阵、颜色分类
|
6月前
|
Java Go C++
Rust每日一练(Leetday0024) 爬楼梯、简化路径、编辑距离
Rust每日一练(Leetday0024) 爬楼梯、简化路径、编辑距离
67 0
Rust每日一练(Leetday0024) 爬楼梯、简化路径、编辑距离
|
6月前
|
Java Go C++
Rust每日一练(leetDay0023) 二进制求和、左右对齐、平方根
Rust每日一练(leetDay0023) 二进制求和、左右对齐、平方根
67 0
Rust每日一练(leetDay0023) 二进制求和、左右对齐、平方根
|
6月前
|
Java Go C++
Rust每日一练(Leetday0022) 最小路径和、有效数字、加一
Rust每日一练(Leetday0022) 最小路径和、有效数字、加一
63 0
Rust每日一练(Leetday0022) 最小路径和、有效数字、加一