simulation/
lib.rs

1//! # Rust :: Simulation
2
3/// 2161m Partition Array According to Given Pivot
4struct Sol2161;
5
6impl Sol2161 {
7    pub fn pivot_array(nums: Vec<i32>, pivot: i32) -> Vec<i32> {
8        let mut rst = vec![pivot; nums.len()];
9
10        let (mut left, mut right) = (0, nums.len() - 1);
11        for (l, r) in (0..nums.len()).zip((0..nums.len()).rev()) {
12            if nums[l] < pivot {
13                rst[left] = nums[l];
14                left += 1;
15            }
16            if nums[r] > pivot {
17                rst[right] = nums[r];
18                right -= 1;
19            }
20        }
21
22        println!(":: {:?}", rst);
23
24        rst
25    }
26}
27
28/// 2460 Apply Operations to an Array
29struct Sol2460;
30
31impl Sol2460 {
32    pub fn apply_operations(nums: Vec<i32>) -> Vec<i32> {
33        let mut nums = nums;
34        for i in 0..nums.len() - 1 {
35            match nums[i] == nums[i + 1] {
36                true => {
37                    nums[i] *= 2;
38                    nums[i + 1] = 0;
39                }
40                _ => (),
41            }
42        }
43
44        let mut vcopy = nums.to_vec();
45        vcopy.sort_by_key(|&v| if v > 0 { 0 } else { 1 });
46
47        println!("-> {:?}", vcopy);
48
49        for z in 0..nums.len() {
50            if nums[z] == 0 {
51                let mut swap = z;
52                while nums[swap] == 0 {
53                    swap += 1;
54                    if swap >= nums.len() {
55                        return nums;
56                    }
57                }
58                (nums[z], nums[swap]) = (nums[swap], nums[z]);
59            }
60        }
61
62        nums
63    }
64}
65
66#[cfg(test)]
67mod tests {
68    use super::*;
69
70    #[test]
71    fn test_2161() {
72        assert_eq!(
73            Sol2161::pivot_array(vec![9, 12, 5, 10, 14, 3, 10], 10),
74            vec![9, 5, 3, 10, 10, 12, 14]
75        );
76        assert_eq!(
77            Sol2161::pivot_array(vec![-3, 4, 3, 2], 2),
78            vec![-3, 2, 4, 3]
79        );
80    }
81
82    #[test]
83    fn test_2460() {
84        assert_eq!(
85            Sol2460::apply_operations(vec![1, 2, 2, 1, 1, 0]),
86            vec![1, 4, 2, 0, 0, 0]
87        );
88        assert_eq!(Sol2460::apply_operations(vec![0, 1]), vec![1, 0]);
89        assert_eq!(
90            Sol2460::apply_operations(vec![
91                847, 847, 0, 0, 0, 399, 416, 416, 879, 879, 206, 206, 206, 272
92            ]),
93            vec![1694, 399, 832, 1758, 412, 206, 272, 0, 0, 0, 0, 0, 0, 0]
94        );
95    }
96}