Challenge 42
Rust Challenge: Group and Count Consecutive Elements
Given a vector of integers, create a function group_and_count that groups consecutive identical elements together and returns a vector of tuples, where each tuple contains an element and its count in the sequence.
fn group_and_count(nums: Vec<i32>) -> Vec<(i32, usize)> { // your implementation goes here // don't touch the code in the main function below } fn main() { // Test 1: Basic case with consecutive elements let result1 = group_and_count(vec![1, 1, 2, 2, 2, 3, 3, 1]); let expected1 = vec![(1, 2), (2, 3), (3, 2), (1, 1)]; if result1 != expected1 { panic!("Test 1 failed: Expected {:?}, got {:?}", expected1, result1); } println!("Test 1 passed: group_and_count([1, 1, 2, 2, 2, 3, 3, 1]) = {:?}", result1); // Test 2: Single element repeated let result2 = group_and_count(vec![5, 5, 5]); let expected2 = vec![(5, 3)]; if result2 != expected2 { panic!("Test 2 failed: Expected {:?}, got {:?}", expected2, result2); } println!("Test 2 passed: group_and_count([5, 5, 5]) = {:?}", result2); // Test 3: Empty vector let result3 = group_and_count(vec![]); let expected3: Vec<(i32, usize)> = vec![]; if result3 != expected3 { panic!("Test 3 failed: Expected {:?}, got {:?}", expected3, result3); } println!("Test 3 passed: group_and_count([]) = {:?}", result3); // Test 4: No consecutive elements let result4 = group_and_count(vec![1, 2, 3, 4, 5]); let expected4 = vec![(1, 1), (2, 1), (3, 1), (4, 1), (5, 1)]; if result4 != expected4 { panic!("Test 4 failed: Expected {:?}, got {:?}", expected4, result4); } println!("Test 4 passed: group_and_count([1, 2, 3, 4, 5]) = {:?}", result4); // Test 5: All elements the same let result5 = group_and_count(vec![2, 2, 2, 2, 2]); let expected5 = vec![(2, 5)]; if result5 != expected5 { panic!("Test 5 failed: Expected {:?}, got {:?}", expected5, result5); } println!("Test 5 passed: group_and_count([2, 2, 2, 2, 2]) = {:?}", result5); }
Solution
Click to Show/Hide Solution
#![allow(unused)] fn main() { fn group_and_count(nums: Vec<i32>) -> Vec<(i32, usize)> { let mut result = Vec::new(); if nums.is_empty() { return result; } let mut current_num = nums[0]; let mut current_count = 1; for &num in nums.iter().skip(1) { if num == current_num { current_count += 1; } else { result.push((current_num, current_count)); current_num = num; current_count = 1; } } result.push((current_num, current_count)); result } }