🐼

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