🐼
Rustのリスト操作練習問題集#3(中級編)
Rustのリスト操作練習問題集
Rustのイテレータとコレクション操作を練習するための問題集です。
基本的にはiter操作と配列の操作だけで解けるようにしています。 テスト用のリストも載せてあります。そのままコピペで使えるようにしてあります。別解などありましたらコメントくださるとありがたいです。
問題1:条件分岐と文字列の反転
問題
- 半角スペース区切りの文が与えられる。単語の長さが5文字以上のものを反転させて出力。
- 例:I always play soccer -> I syawla play reccos
- 入力:str
- 出力:String
- 制約: なし
テンプレートとテスト
fn solution(words: &str) -> String {
// ここに解答を書いてください
unimplemented!()
}
fn main() {
// 簡易テスト(4件)
assert_eq!(solution("I always play soccer"), "I syawla play reccos");
assert_eq!(solution("Hello world"), "olleH dlrow");
assert_eq!(solution("") , "");
assert_eq!(solution("abcd efghi"), "abcd ihgfe");
}
解答と解説
fn solution(words: &str) -> String {
words
.split_whitespace()
.map(|w| if w.len() >= 5 {
w.chars().rev().collect()
} else {
w.to_string()
})
.collect::<Vec<_>>()
.join(" ")
}
fn main() {
// 簡易テスト(4件)
assert_eq!(solution("I always play soccer"), "I syawla play reccos");
assert_eq!(solution("Hello world"), "olleH dlrow");
assert_eq!(solution("") , "");
assert_eq!(solution("abcd efghi"), "abcd ihgfe");
}
- 主要メソッド/イディオム:
-
split_whitespace,map,chars,rev,collect::<Vec<_>>(),join
-
- 計算量・メモリ特性の要点:
- 各単語に対して長さ判定と反転(全体で O(文字数))
- 注意点・落とし穴:
-
split_whitespaceは連続空白を1区切りとして扱う -
len()はバイト長。厳密な「文字数」で判定するならchars().count()を使う
-
問題2:条件を満たすインデックスの配列を取得
問題
- 配列[i32;N]が与えられる,要素の値が0のもののindexをベクトルとして返す
- 入力:[i32;N]
- 出力:Vec<i32>
- 制約: なし
テンプレートとテスト
fn solution(arr: &[i32]) -> Vec<usize> {
//ここに解答を書いてください
unimplemented!()
}
fn main() {
//簡易テスト(4件)
assert_eq!(solution(&[1, 0, 3, 0, 5]), vec![1, 3]);
assert_eq!(solution(&[0, 0, 0]), vec![0, 1, 2]);
assert_eq!(solution(&[1, 2, 3]), vec![]);
assert_eq!(solution(&[]), vec![]);
}
解答と解説
fn solution(arr: &[i32]) -> Vec<usize> {
arr.iter()
.enumerate()
.filter(|(_, &value)| value == 0)
.map(|(index, _)| index)
.collect()
}
fn main() {
//簡易テスト(4件)
assert_eq!(solution(&[1, 0, 3, 0, 5]), vec![1, 3]);
assert_eq!(solution(&[0, 0, 0]), vec![0, 1, 2]);
assert_eq!(solution(&[1, 2, 3]), vec![]);
assert_eq!(solution(&[]), vec![]);
}
- 主要メソッド/イディオム:
-
iter(),enumerate(),filter(),map(),collect()
-
- 注意点:
-
enumerate()でインデックスと値を同時に取得 -
filter()で条件を満たす要素のみを抽出 -
map()でインデックスのみを抽出してcollect()でVecに変換
-
Discussion