rustgym/leetcode/
_670_maximum_swap.rs

1struct Solution;
2
3impl Solution {
4    fn maximum_swap(num: i32) -> i32 {
5        let mut s: Vec<char> = num.to_string().chars().collect();
6        let n = s.len();
7        let mut last: Vec<usize> = vec![0; 10];
8        for i in 0..n {
9            last[(s[i] as u8 - b'0') as usize] = i;
10        }
11        for i in 0..n {
12            let d = (s[i] as u8 - b'0') as usize;
13            for j in (d + 1..10).rev() {
14                if last[j] > i {
15                    s.swap(i, last[j]);
16                    return s.into_iter().collect::<String>().parse::<i32>().unwrap();
17                }
18            }
19        }
20        num
21    }
22}
23
24#[test]
25fn test() {
26    let num = 2736;
27    let res = 7236;
28    assert_eq!(Solution::maximum_swap(num), res);
29    let num = 9973;
30    let res = 9973;
31    assert_eq!(Solution::maximum_swap(num), res);
32    let num = 9973;
33    let res = 9973;
34    assert_eq!(Solution::maximum_swap(num), res);
35    let num = 19;
36    let res = 91;
37    assert_eq!(Solution::maximum_swap(num), res);
38}