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

相关推荐
碳苯1 分钟前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os
kylinxjd17 分钟前
spring boot发送邮件
java·spring boot·后端·发送email邮件
2401_857439694 小时前
Spring Boot新闻推荐系统:用户体验优化
spring boot·后端·ux
进击的女IT4 小时前
SpringBoot上传图片实现本地存储以及实现直接上传阿里云OSS
java·spring boot·后端
一 乐6 小时前
学籍管理平台|在线学籍管理平台系统|基于Springboot+VUE的在线学籍管理平台系统设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·学习
艾伦~耶格尔8 小时前
Spring Boot 三层架构开发模式入门
java·spring boot·后端·架构·三层架构
man20179 小时前
基于spring boot的篮球论坛系统
java·spring boot·后端
攸攸太上9 小时前
Spring Gateway学习
java·后端·学习·spring·微服务·gateway
罗曼蒂克在消亡10 小时前
graphql--快速了解graphql特点
后端·graphql
潘多编程10 小时前
Spring Boot与GraphQL:现代化API设计
spring boot·后端·graphql