2578 - Split With Minimum Sum
problem
Given a positive integer num, split it into two non-negative integers num1 and num2 such that:
- The concatenation of
num1andnum2is a permutation ofnum.- In other words, the sum of the number of occurrences of each digit in
num1andnum2is equal to the number of occurrences of that digit innum.
- In other words, the sum of the number of occurrences of each digit in
num1andnum2can contain leading zeros.
Return the minimum possible sum of num1 and num2.
Notes:
- It is guaranteed that
numdoes not contain any leading zeros. - The order of occurrence of the digits in
num1andnum2may differ from the order of occurrence ofnum.
Example 1:
Input: num = 4325 Output: 59 Explanation: We can split 4325 so thatnum1is 24 andnum2is 35, giving a sum of 59. We can prove that 59 is indeed the minimal possible sum.
Example 2:
Input: num = 687 Output: 75 Explanation: We can split 687 so thatnum1is 68 andnum2is 7, which would give an optimal sum of 75.
Constraints:
10 <= num <= 109
submission
// rust one line just for fun
impl Solution {
pub fn split_num(mut num: i32) -> i32 {
std::iter::from_fn(|| {
(num > 0).then(|| {
let digit = num % 10;
num /= 10;
digit
})
})
.collect::<std::collections::BinaryHeap<i32>>()
.into_sorted_vec()
.rchunks(2)
.map(|w| w.iter().sum::<i32>())
.zip(std::iter::successors(Some(1), |prev| Some(prev * 10)))
.map(|(s, m)| s * m)
.sum()
}
}