用Rust刷LeetCode之58 最后一个单词的长度

  1. 最后一个单词的长度[1]

难度: 简单

原描述:

思路

使用标准库:

复制代码
package main

import (
 "fmt"
 "strings"
)

func lengthOfLastWord(s string) int {
 s = strings.TrimSpace(s) // 删除 首尾 的空格
 arr := strings.Split(s, " ") // 字符串转为切片
 return len(arr[len(arr)-1]) // 获取切片最后一个元素的长度
}

func main() {
 fmt.Println(lengthOfLastWord("Hello World"))
}

Rust版本1:

复制代码
fn main() {
    let len = length_of_last_word("  hello world666  ".to_owned());
    println!("最后一个单词的长度为: {:?}", len); // 输出: 8
}

pub fn length_of_last_word(s: String) -> usize {
    let s = s.trim();

    // 根据空格分割将字符串转为vec
    let v: Vec<&str> = s.split(' ').collect();

    // 打印每个元素
    // for c in v.iter() {
    //     println!("{}", c);
    // }

    // 获取vec中最后一个元素的长度
    v.last().unwrap().len()
}

Rust版本2:

复制代码
fn main() {
    let len = length_of_last_word("  hello world666  ".to_owned());
    println!("最后一个单词的长度为: {:?}", len); // 输出: 8
}

pub fn length_of_last_word(s: String) -> usize {
    let s = s.trim();
    let mut i = s.len() - 1;
    for c in s.chars().rev() {
        if c!= ' ' {
            i -= 1;
        } else {
            break;
        }
    }
    return s.len() - i - 1;
}

Rust中为什么没有i++和i--?

在Rust语言中,i++i-- 这样的后缀自增和自减运算符是故意被省略的。这种设计选择的原因包括:

  1. 明确性和易读性 :Rust强调代码的明确性和易读性。在C++等语言中,i++i-- 可以在表达式中使用,有时会导致理解上的混淆,特别是当它们与其他运算符混合使用时。Rust倾向于更明确、不容易出错的方式,如 i += 1i -= 1
  2. 避免不必要的复杂性:自增和自减运算符在某些情况下可以导致不必要的复杂性,尤其是在涉及运算符重载或复杂表达式时。Rust试图避免这种复杂性。
  3. 表达意图更清晰 :使用 i += 1i -= 1 使得代码的意图更加清晰和直接。这种方式明确表达了对变量的操作,而不是依赖于特定的运算符语义。
  4. 与Rust的安全和并发原则相符:Rust的设计重点是安全性和并发编程。在并发环境中,明确地表达状态变化是非常重要的,而后缀自增和自减运算符可能会隐藏这些变化的细节。

总之,Rust没有包含 i++i-- 是为了保持语言的简洁性,减少代码中的潜在错误,并鼓励开发者编写明确、易于理解的代码。

那在遍历时,怎么控制i的增减?

在Rust中,控制循环变量(如 i)的增减通常通过不同的方式实现,而不是使用传统的 i++i--。这里有几种常见的方法:

  1. 使用范围和 for 循环 :Rust中最常见的遍历方式是使用 for 循环和范围操作符。这种方法在遍历数组、向量(vector)或其他集合时非常有效。

    复制代码
    for i in 0..10 {
        println!("{}", i); // 正向遍历:0, 1, 2, ..., 9
    }
    
    for i in (0..10).rev() {
        println!("{}", i); // 反向遍历:9, 8, 7, ..., 0
    }
  2. 显式地修改循环变量 :如果你需要更复杂的控制,可以使用 while 循环或循环中的 if 语句来显式地增减变量。

    复制代码
    let mut i = 0;
    while i < 10 {
        println!("{}", i);
        i += 1; // 明确增加i
    }

    或者根据条件进行增减:

    复制代码
    let mut i = 0;
    while i < 10 {
        println!("{}", i);
        if condition {
            i += 2; // 某种条件下增加
        } else {
            i += 1; // 默认增加
        }
    }
  3. 迭代器和函数式方法:Rust还支持迭代器和链式函数调用,这在处理集合时尤其有用。你可以使用迭代器方法来过滤、映射、折叠(fold)等。

    复制代码
    (0..10).filter(|&x| x % 2 == 0).for_each(|x| println!("{}", x)); // 遍历偶数

在大多数情况下,Rust推荐使用第一种方法,即使用 for 循环和范围。这种方法不仅代码简洁,而且避免了潜在的边界错误。当然,根据你的具体需求,其他方法也可以非常有效。

参考资料

1

  1. 最后一个单词的长度: https://leetcode.cn/problems/length-of-last-word/

本文由mdnice多平台发布

相关推荐
2401_8955213420 小时前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare20 小时前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL20 小时前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本1 天前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
yhole1 天前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉1 天前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠1 天前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet1 天前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明1 天前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff1 天前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法