Challenge 37
Rust Challenge: Matrix Transposition
Write a function transpose
that takes a 2D vector (matrix) of integers and returns its transpose (rows become columns, columns become rows).
Handle non-square matrices and empty matrices.
fn transpose(matrix: &Vec<Vec<u32>>) -> Result<Vec<Vec<u32>>, String> { // your implementation goes here // don't touch the code in the main function below } fn main() { // Test 1: Square matrix 3x3 let matrix1 = vec![vec![1, 2, 3], vec![4, 5, 6], vec![7, 8, 9]]; let result1 = transpose(&matrix1); let expected1 = vec![vec![1, 4, 7], vec![2, 5, 8], vec![3, 6, 9]]; match result1 { Ok(res) => { if res != expected1 { panic!("Test 1 failed: Expected {:?}, got {:?}", expected1, res); } println!("Test 1 passed: {:?}", res); } Err(e) => panic!("Test 1 failed with error: {}", e), } // Test 2: Empty matrix - should return an error let matrix2: Vec<Vec<u32>> = vec![]; let result2 = transpose(&matrix2); match result2 { Ok(res) => panic!("Test 2 failed: Expected an error for empty matrix, got {:?}", res), Err(_) => println!("Test 2 passed: transpose returned an error for empty matrix as expected"), } }
Solution
Click to Show/Hide Solution
#![allow(unused)] fn main() { fn transpose(matrix: &Vec<Vec<u32>>) -> Result<Vec<Vec<u32>>, String> { if matrix.is_empty() { return Err("The input matrix cannot be empty".to_string()); } if matrix[0].is_empty() { return Ok(vec![]); } let rows = matrix.len(); let cols = matrix[0].len(); let mut result = vec![vec![0; rows]; cols]; for i in 0..rows { for j in 0..matrix[i].len() { result[j][i] = matrix[i][j]; } } Ok(result) } }