用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多平台发布

相关推荐
红尘散仙2 小时前
我把终端小说阅读器接上了 AI Agent:TRNovel 现在能用 skill 生成书源了
人工智能·后端·rust
卷毛的技术笔记4 小时前
告别硬编码!Spring AI Alibaba 实现 AI Agent 智能工具调用(Tool Calling)
java·人工智能·后端·python·spring·ai编程
会编程的土豆4 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
喵个咪4 小时前
GoWind Toolkit Go后端代码生成 完整全流程实战
后端·go·orm
basketball6165 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang
qq_2518364575 小时前
SpringBoot+Vue 共享电池柜管理系统 完整实现 前后端分离项目实战 完整代码
vue.js·spring boot·后端
zhangxingchao5 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
IT_陈寒6 小时前
Vite打包时遇到的坑,原来问题出在这里
前端·人工智能·后端
ayqy贾杰7 小时前
基层管理的三板斧,在AI时代行不通了
前端·后端·团队管理
Apifox7 小时前
Apifox 5 月更新|Postman 导入优化、Runner 支持非 root 运行、请求代码自动带鉴权
前端·后端·安全