Skip to main content

algorithmz/array/
max_ones_index.rs

1/// Find the index of 0 to replace with 1 for the longest run of 1s.
2///
3/// Takes a list reference and returns an `i32` or an error detailing the problem.
4///
5/// # Examples
6///
7/// Basic usage:
8/// ```
9/// let result = algorithmz::array::max_ones_index(&[1,1,1,0,1,1,1,1,1,0,1,1,1]).unwrap();
10/// assert_eq!(result,3);
11/// ```
12///
13/// Match example:
14/// ```
15/// use algorithmz::array::max_ones_index;
16/// match max_ones_index(&[1,1,1,0,1,1,1,1,1,0,1,1,1]) {
17///     Ok(n) => println!("The result was: {}",n),
18///     Err(e) => eprintln!("The problems was: {}",e),
19/// }
20/// ```
21pub fn max_ones_index(list: &[i32]) -> Result<i32, String> {
22    if list.is_empty() {
23        return Err("Cannot use max ones on an empty list!".to_string());
24    }
25    if !list.iter().all(|&x| x == 0 || x == 1) {
26        return Err("The list may only contain 1-s and 0-s!".to_string());
27    }
28    let length = list.len();
29    let mut max_count: i32 = 0;
30    let mut max_index: i32 = 0;
31    let mut prev_zero: i32 = -1;
32    let mut prev_prev_zero: i32 = -1;
33    for current in 0..length {
34        if list[current] == 0 {
35           if current as i32 - prev_prev_zero > max_count {
36                max_count = current as i32 - prev_prev_zero;
37                max_index = prev_zero;
38           } 
39           prev_prev_zero = prev_zero;
40           prev_zero = current as i32;
41        }
42    }
43    if length as i32 - prev_prev_zero > max_count {
44        max_index = prev_zero;
45    }
46    Ok(max_index)
47}
48
49