[閒聊] 每日leetcode 75

看板 Marginalman
作者 yam276 (史萊哲林的優等生)
時間 2025-05-27 18:38:46
留言 0則留言 (0推 0噓 0→)

1768. Merge Strings Alternately https://leetcode.com/problems/merge-strings-alternately/ 題意: 兩個字串 word1, word2 讓他們的字元交錯組合成新字串 思路: 這一題比較簡單 所以可以來挑戰 Rust 鏈式方法 那如果你用普通的鏈式思路 會發現兩個字串沒辦法輪流遍歷 所以要先組合起來 用 .zip() 方法: word1.chars().zip(word2.chars()) 這樣會得到一個 (word1, word2) 的 iterator 之後本來是要用 .map() 但會遇到問題 .map() 會回傳 Iterator<Iterator<T>> 不符合需求 所以改用 .flat_map() 這方法會把東西壓成同一個 Iterator 陣列: .flat_map(|(c1, c2)| std::iter::once(c1).chain(std::iter::once(c2))) 用 std::iter::once() 是因為這個比較省空間 用 vec! 跟 .into_iter() 都會有額外的 heap 分配: let i1 = std::iter::once('a'); // 更輕量 let i2 = vec!['a'].into_iter(); // 多了一層 heap 分配 我們串接完之後會遇到一個問題 就是 .zip() 會捨棄 多餘的部分 所以要另外加上 word1/word2 去除對方長度的部分 做兩次是因為不確定誰比較長 .chain(word1.chars().skip(word2.chars().count())) .chain(word2.chars().skip(word1.chars().count())) 最後把展開的 Iterator 收束 .collect() 這解法空間複雜度不是最好 但是可以學鏈式串接用法 Code: impl Solution { pub fn merge_alternately(word1: String, word2: String) -> String { word1 .chars() .zip(word2.chars()) .flat_map(|(c1, c2)| std::iter::once(c1) .chain(std::iter::once(c2))) .chain(word1.chars().skip(word2.chars().count())) .chain(word2.chars().skip(word1.chars().count())) .collect() } } --
※ 批踢踢實業坊(ptt.cc), 來自: 60.248.143.172 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1748342328.A.B95.html

您可能感興趣