Rust交替合并字符串函数异常:不等长字符串丢失字符问题
Rust交替合并字符串函数的字符丢失问题修复
问题原因
你的代码中第一个while let循环的条件是同时调用chars1.next()和chars2.next(),当其中一个字符串的迭代器耗尽时,另一个迭代器的next()已经被调用了一次,这个被取出的字符没有被添加到结果中,也无法被后续循环捕获,直接导致字符丢失。
以测试用例word1="ab"、word2="pqrs"为例:
- 前两次循环正常取出
a&p、b&q,结果为apbq。 - 第三次循环时,
chars1.next()返回None,而chars2.next()返回Some('r'),但元组(None, Some('r'))不满足(Some(c1), Some(c2))的匹配条件,这个'r'被直接丢弃。 - 后续循环只能从
chars2中取出s,最终结果少了'r',变成apbqs。
修复方案
修改循环逻辑,避免同时消耗两个迭代器的元素。先交替取出第一个字符串的元素和第二个字符串的对应元素,当其中一个字符串耗尽后,再处理另一个字符串的剩余元素。
修复后的代码:
impl Solution { pub fn merge_alternately(word1: String, word2: String) -> String { let mut merged = String::new(); let mut chars1 = word1.chars(); let mut chars2 = word2.chars(); // 交替取word1和word2的字符,直到word1耗尽 while let Some(c1) = chars1.next() { merged.push(c1); // 如果word2还有字符,同步取出 if let Some(c2) = chars2.next() { merged.push(c2); } } // 处理word2剩余的字符 while let Some(c2) = chars2.next() { merged.push(c2); } merged } }
更简洁的迭代器写法
利用Rust迭代器的zip和chain特性,可以更简洁地实现需求:
impl Solution { pub fn merge_alternately(word1: String, word2: String) -> String { let mut chars1 = word1.chars(); let mut chars2 = word2.chars(); chars1.zip(chars2) .flat_map(|(c1, c2)| [c1, c2]) .chain(chars1) .chain(chars2) .collect() } }
zip将两个迭代器的元素配对,直到其中一个迭代器耗尽。flat_map把每对字符展开为单独的字符序列。chain将剩余未处理的字符迭代器追加到结果中。
内容的提问来源于stack exchange,提问作者Hamza Sajid
相关产品推荐
相关产品推荐

