You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust交替合并字符串函数异常:不等长字符串丢失字符问题

Rust交替合并字符串函数的字符丢失问题修复

问题原因

你的代码中第一个while let循环的条件是同时调用chars1.next()和chars2.next(),当其中一个字符串的迭代器耗尽时,另一个迭代器的next()已经被调用了一次,这个被取出的字符没有被添加到结果中,也无法被后续循环捕获,直接导致字符丢失。

以测试用例word1="ab"、word2="pqrs"为例:

  1. 前两次循环正常取出a&p、b&q,结果为apbq。
  2. 第三次循环时,chars1.next()返回None,而chars2.next()返回Some('r'),但元组(None, Some('r'))不满足(Some(c1), Some(c2))的匹配条件,这个'r'被直接丢弃。
  3. 后续循环只能从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 00:12:51