【Rust Exercism 练习详解:Anagram + Space Age + Sublist(附完整代码与深度解读)】

发布时间:2026/5/26 1:39:28

【Rust Exercism 练习详解:Anagram + Space Age + Sublist(附完整代码与深度解读)】 Rust Exercism 练习系列详解Anagram、Space Age、Sublist大家好我是小杍随笔。最近在刷 Exercism Rust Track 时遇到了几个经典练习Anagram变位词、Space Age行星年龄和Sublist子列表判断。这些练习分别考察了生命周期lifetimes、trait 默认实现 宏、枚举 模式匹配 windows API等 Rust 核心特性。下面我把我们讨论的过程、代码实现和详细解读整理成一篇供大家参考。1. Anagram变位词判断练习要求给定一个目标词和若干候选词找出所有是目标词变位词anagram的候选词。忽略大小写不把单词自身视为变位词支持 Unicode。关键点需要调整函数签名中的生命周期使用小写 排序判断字母组成是否相同完整实现usestd::collections::HashSet;fnnormalize(s:str)-Vecchar{letmutchars:Vecchars.to_lowercase().collect();chars.sort_unstable();chars}pubfnanagrams_fora(word:str,possible_anagrams:[astr])-HashSetastr{letword_normnormalize(word);possible_anagrams.iter().filter(|candidate|{// 排除自身忽略大小写ifcandidate.to_lowercase()word.to_lowercase(){returnfalse;}normalize(candidate)word_norm}).copied().collect()}解读normalize函数把字符串转为小写字符并排序是判断变位词最简洁高效的方式。生命周期a确保返回的引用与输入候选词生命周期一致。2. Space Age行星年龄计算练习要求给定秒数计算在不同行星上相当于多少年每个行星轨道周期不同。关键点Fromu64实现Planettrait 为每个行星实现years_during推荐实现清晰版#[derive(Debug)]pubstructDuration{seconds:u64,}constSECONDS_PER_EARTH_YEAR:u6431_557_600;constMERCURY:f640.2408467;constVENUS:f640.61519726;constEARTH:f641.0;constMARS:f641.8808158;constJUPITER:f6411.862615;constSATURN:f6429.447498;constURANUS:f6484.016846;constNEPTUNE:f64164.79132;implFromu64forDuration{fnfrom(s:u64)-Self{Duration{seconds:s}}}pubtraitPlanet{fnyears_during(d:Duration)-f64;}pubstructMercury;implPlanetforMercury{fnyears_during(d:Duration)-f64{d.secondsasf64/SECONDS_PER_EARTH_YEARasf64/MERCURY}}// Venus、Earth、Mars、Jupiter、Saturn、Uranus、Neptune 同理实现...计算公式行星年数 (秒数 ÷ 地球年秒数) ÷ 该行星轨道周期地球年优化建议可以使用macro_rules!消除重复代码或者用关联常量 默认实现让代码更 DRY。3. Sublist子列表 / 超列表判断练习要求判断两个列表的关系Equal完全相等Sublist第一个是第二个的子列表Superlist第一个是第二个的超列表Unequal以上均不成立核心函数解读fnis_sublist(needle:[i32],haystack:[i32])-bool{ifneedle.len()haystack.len(){returnfalse;}haystack.windows(needle.len()).any(|w|wneedle)}详细解读haystack.windows(needle.len())滑动窗口API返回大列表中所有长度等于needle的连续子切片。例如 haystack [1,2,3,4]needle.len()2 时会产生[1,2]、[2,3]、[3,4]。.any(|w| w needle)只要有一个窗口与 needle 完全相等就返回true。这是 Rust 中判断连续子列表的最优雅写法零成本、高性能。完整sublist函数推荐现代写法#[derive(Debug, PartialEq, Eq)]pubenumComparison{Equal,Sublist,Superlist,Unequal,}pubfnsublist(first_list:[i32],second_list:[i32])-Comparison{iffirst_list.is_empty()second_list.is_empty(){returnComparison::Equal;}iffirst_list.is_empty(){returnComparison::Sublist;}ifsecond_list.is_empty(){returnComparison::Superlist;}matchfirst_list.len().cmp(second_list.len()){std::cmp::Ordering::Equal{iffirst_listsecond_list{Comparison::Equal}else{Comparison::Unequal}}std::cmp::Ordering::Less{ifis_sublist(first_list,second_list){Comparison::Sublist}else{Comparison::Unequal}}std::cmp::Ordering::Greater{ifis_sublist(second_list,first_list){Comparison::Superlist}else{Comparison::Unequal}}}}match 表达式解读first_list.len().cmp(second_list.len())返回Ordering::Equal / Less / Greater用于快速分流逻辑避免不必要的检查。总结与建议Anagram重点掌握生命周期和字符串规范化。Space Age练习 trait 默认实现、常量提取和代码去重宏或关联常量。Sublist是 Rust 迭代器和模式匹配的经典案例windows()any()是必学技巧。这些练习难度适中但覆盖了 Rust 很多重要概念。建议多读官方文档中关于lifetimes、traits、iterators的章节。文章标签Rust、Exercism、Rust 练习、生命周期、Trait、Sublist、Anagram、Space Age、Rust 入门

相关新闻