Created
August 30, 2024 22:30
-
-
Save PopeFelix/4541ed75e9ca7d01eb94252548cfb91d to your computer and use it in GitHub Desktop.
Build ranges of numbers in Rust
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /// Takes a vector of closed intervals of the form [start, end], merges any invervals in which one interval | |
| /// overlaps with another (i.e. at least one of the endpoints of one interval is contained within a second | |
| /// interval), and returns a list of the merged intervals. | |
| fn main() { | |
| // sort ranges numerically | |
| // Define a vector of ranges | |
| let ranges = vec![[15, 18], [2, 6], [8, 10], [1, 3]]; | |
| // let ranges = vec![[1, 5], [2, 3], [4, 8], [9, 10], [9, 12]]; | |
| // Call merge_ranges function with the ranges | |
| let merged = merge_ranges(ranges); | |
| println!("Output: {:?}", merged); | |
| // Expected output: [1, 6], [8, 10], [15, 18] | |
| } | |
| fn merge_ranges(ranges: Vec<[i32; 2]>) -> Vec<[i32; 2]> { | |
| let mut merged = Vec::new(); | |
| let mut r2 = ranges.clone(); | |
| r2.sort_by(|a, b| a[0].cmp(&b[0])); | |
| let mut count: i32 = 0; | |
| let mut start: i32; | |
| let mut end: i32; | |
| let mut range: Vec<i32> = vec![]; | |
| // let last = r2.last(); | |
| let last = r2.len() as i32; | |
| for element in r2 { | |
| start = element[0]; | |
| end = element[1]; | |
| dbg!([start, end]); | |
| if range.is_empty() { | |
| range = vec![start, end]; | |
| } else { | |
| let range_start = range[0]; | |
| let range_end = range[1]; | |
| if end > range_end { | |
| if start <= range_end { | |
| range[1] = end; | |
| if start < range_start { | |
| range[0] = start | |
| } | |
| } else { | |
| // start > range_end | |
| merged.push([range[0], range[1]]); | |
| dbg!(&merged); | |
| range = vec![start, end]; | |
| } | |
| } else if end == range_end { | |
| if start < range_start { | |
| range[0] = start | |
| } | |
| } else { | |
| // end < range_end | |
| if end < range_start { | |
| merged.push([range[0], range[1]]); | |
| range = vec![start, end]; | |
| } else { | |
| // end >= range_start | |
| range[1] = end | |
| } | |
| } | |
| } | |
| count = count + 1; | |
| if count == last { | |
| merged.push([range[0], range[1]]); | |
| } | |
| dbg!(&range); | |
| } | |
| merged.sort_by(|a, b| a[0].cmp(&b[0])); | |
| merged | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment