※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1748342328.A.B95.html
[閒聊] 每日leetcode 75
看板 | Marginalman |
---|---|
作者 | yam276 (史萊哲林的優等生) |
時間 | 2025-05-27 18:38:46 |
留言 | 0則留言 (0推 0噓 0→) |
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
1768. Merge Strings Alternately
※ 文章網址: https://www.ptt.cc/bbs/Marginalman/M.1748342328.A.B95.html