rustgym/leetcode/
_949_largest_time_for_given_digits.rs1struct Solution;
2
3use std::fmt;
4
5#[derive(Debug, PartialEq, Eq, Clone)]
6struct Time {
7 hour: i32,
8 minute: i32,
9}
10
11impl Time {
12 fn new(hour: i32, minute: i32) -> Self {
13 Time { hour, minute }
14 }
15 fn is_valid(&self) -> bool {
16 self.hour < 24 && self.minute < 60
17 }
18 fn from_digits(a: &[i32]) -> Self {
19 Self::new(a[0] * 10 + a[1], a[2] * 10 + a[3])
20 }
21 fn to_minutes(&self) -> i32 {
22 self.hour * 60 + self.minute
23 }
24 fn to_digits(&self) -> Vec<i32> {
25 vec![
26 self.hour / 10,
27 self.hour % 10,
28 self.minute / 10,
29 self.minute % 10,
30 ]
31 }
32}
33
34impl fmt::Display for Time {
35 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
36 let a = self.to_digits();
37 write!(f, "{}{}:{}{}", a[0], a[1], a[2], a[3])
38 }
39}
40
41use std::cmp::Ordering;
42
43impl PartialOrd for Time {
44 fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
45 Some(self.to_minutes().cmp(&other.to_minutes()))
46 }
47}
48
49impl Solution {
50 fn backtrack(a: &mut Vec<i32>, index: usize, max: &mut Option<Time>) {
51 let n = a.len();
52 if index == n {
53 let time = Time::from_digits(a);
54 if time.is_valid() {
55 if let Some(max_time) = max {
56 if time > *max_time {
57 *max = Some(time)
58 }
59 } else {
60 *max = Some(time)
61 }
62 }
63 } else {
64 for i in index..n {
65 a.swap(index, i);
66 Self::backtrack(a, index + 1, max);
67 a.swap(index, i);
68 }
69 }
70 }
71 fn largest_time_from_digits(mut a: Vec<i32>) -> String {
72 let mut max: Option<Time> = None;
73 Self::backtrack(&mut a, 0, &mut max);
74 if let Some(max_time) = max {
75 max_time.to_string()
76 } else {
77 "".to_string()
78 }
79 }
80}
81
82#[test]
83fn test() {
84 let a = vec![1, 2, 3, 4];
85 let res = "23:41".to_string();
86 assert_eq!(Solution::largest_time_from_digits(a), res);
87 let a = vec![5, 5, 5, 5];
88 let res = "".to_string();
89 assert_eq!(Solution::largest_time_from_digits(a), res);
90 let a = vec![0, 0, 0, 0];
91 let res = "00:00".to_string();
92 assert_eq!(Solution::largest_time_from_digits(a), res);
93}