1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#![allow(dead_code)] pub fn pivot_index(nums: Vec<i32>) -> i32 { if nums.len() < 2 { return nums.len() as i32 - 1; } let mut i = 0; let sum: i32 = nums.iter().sum(); let mut half = 0; while i < nums.len() { if half * 2 == sum - nums[i] { return i as i32; } half += nums[i]; i += 1; } -1 } pub fn pivot_index2(nums: Vec<i32>) -> i32 { if nums.len() < 2 { return nums.len() as i32 - 1; } let mut i = 0; let mut right: i32 = nums.iter().sum(); let mut left = 0; while i < nums.len() { right -= nums[i]; if left == right { return i as i32; } left += nums[i]; i += 1; } -1 } #[cfg(test)] mod tests { use super::*; #[test] fn test1() { assert_eq!(pivot_index(vec![1, 7, 3, 6, 5, 6]), 3); assert_eq!(pivot_index(vec![1, 2, 3]), -1); assert_eq!(pivot_index(vec![-1, -1, -1, -1, -1, 0]), 2); assert_eq!(pivot_index(vec![-1, -1, -1, 0, 1, 1]), 0); assert_eq!(pivot_index(vec![0]), 0); assert_eq!(pivot_index(vec![1, 0]), 0); assert_eq!(pivot_index(vec![-1, -1, 0, 1, 1, 0]), 5); } #[test] fn test2() { assert_eq!(pivot_index2(vec![1, 7, 3, 6, 5, 6]), 3); assert_eq!(pivot_index2(vec![1, 2, 3]), -1); assert_eq!(pivot_index2(vec![-1, -1, -1, -1, -1, 0]), 2); assert_eq!(pivot_index2(vec![-1, -1, -1, 0, 1, 1]), 0); assert_eq!(pivot_index2(vec![0]), 0); assert_eq!(pivot_index2(vec![1, 0]), 0); assert_eq!(pivot_index2(vec![-1, -1, 0, 1, 1, 0]), 5); } }