Skip to content

Commit 0d5a3f0

Browse files
committed
Runtime: 3 ms (Top 75.0%) | Memory: 2.25 MB (Top 75.0%)
1 parent e074983 commit 0d5a3f0

File tree

1 file changed

+68
-0
lines changed

1 file changed

+68
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
// Runtime: 3 ms (Top 75.0%) | Memory: 2.25 MB (Top 75.0%)
2+
3+
pub fn normalize(
4+
mut vec: [Vec<u8>; 3],
5+
diff: u8,
6+
) -> Option<[Vec<u8>; 3]> {
7+
if diff < 1 { return Some(vec); }
8+
9+
if vec[1].is_empty() && vec[2].is_empty() {
10+
return None;
11+
}
12+
13+
if vec[1].is_empty() {
14+
vec[2].pop();
15+
return normalize(vec, (diff + 1) % 3);
16+
}
17+
18+
if vec[2].is_empty() {
19+
vec[1].pop();
20+
return normalize(vec, (diff + 2) % 3);
21+
}
22+
23+
// both non-empty
24+
vec[diff as usize].pop();
25+
Some(vec)
26+
}
27+
28+
impl Solution {
29+
fn preproc(mut vec: Vec<i32>) -> ([Vec<u8>; 3], u8) {
30+
vec.sort_unstable();
31+
vec.reverse();
32+
let diff = vec.iter().sum::<i32>() as u32;
33+
let diff = (diff % 3) as u8;
34+
35+
let mut ret = [vec![], vec![], vec![]];
36+
37+
for e in vec {
38+
ret[e as usize % 3].push(e as u8);
39+
}
40+
41+
(ret, diff)
42+
}
43+
44+
fn _impl(vec: Vec<i32>) -> Option<Vec<u8>> {
45+
let (vec, diff) = Self::preproc(vec);
46+
let [mut vec_0, mut vec_1, mut vec_2] = normalize(vec, diff)?;
47+
48+
vec_0.append(&mut vec_1);
49+
vec_0.append(&mut vec_2);
50+
vec_0.sort_unstable();
51+
vec_0.reverse();
52+
53+
if vec_0.is_empty() { return None; }
54+
if vec_0[0] < 1 { return Some(vec![0]); }
55+
56+
Some(vec_0)
57+
}
58+
59+
pub fn largest_multiple_of_three(vec: Vec<i32>) -> String {
60+
let ret = if let Some(inner) = Self::_impl(vec) {
61+
inner
62+
} else { return String::new(); };
63+
64+
ret.into_iter()
65+
.map(|e| (e + '0' as u8) as char)
66+
.collect()
67+
}
68+
}

0 commit comments

Comments
 (0)