comments | difficulty | edit_url | rating | source | tags | |||
---|---|---|---|---|---|---|---|---|
true |
简单 |
1350 |
第 99 场双周赛 Q1 |
|
给你一个正整数 num
,请你将它分割成两个非负整数 num1
和 num2
,满足:
num1
和num2
直接连起来,得到num
各数位的一个排列。<ul> <li>换句话说,<code>num1</code> 和 <code>num2</code> 中所有数字出现的次数之和等于 <code>num</code> 中所有数字出现的次数。</li> </ul> </li> <li><code>num1</code> 和 <code>num2</code> 可以包含前导 0 。</li>
请你返回 num1
和 num2
可以得到的和的 最小 值。
注意:
num
保证没有前导 0 。num1
和num2
中数位顺序可以与num
中数位顺序不同。
示例 1:
输入:num = 4325 输出:59 解释:我们可以将 4325 分割成num1
= 24 和num2
= 35 ,和为 59 ,59 是最小和。
示例 2:
输入:num = 687 输出:75 解释:我们可以将 687 分割成num1
= 68 和num2
= 7 ,和为最优值 75 。
提示:
10 <= num <= 109
我们先用哈希表或数组
接下来,枚举
时间复杂度
class Solution:
def splitNum(self, num: int) -> int:
cnt = Counter()
n = 0
while num:
cnt[num % 10] += 1
num //= 10
n += 1
ans = [0] * 2
j = 0
for i in range(n):
while cnt[j] == 0:
j += 1
cnt[j] -= 1
ans[i & 1] = ans[i & 1] * 10 + j
return sum(ans)
class Solution {
public int splitNum(int num) {
int[] cnt = new int[10];
int n = 0;
for (; num > 0; num /= 10) {
++cnt[num % 10];
++n;
}
int[] ans = new int[2];
for (int i = 0, j = 0; i < n; ++i) {
while (cnt[j] == 0) {
++j;
}
--cnt[j];
ans[i & 1] = ans[i & 1] * 10 + j;
}
return ans[0] + ans[1];
}
}
class Solution {
public:
int splitNum(int num) {
int cnt[10]{};
int n = 0;
for (; num; num /= 10) {
++cnt[num % 10];
++n;
}
int ans[2]{};
for (int i = 0, j = 0; i < n; ++i) {
while (cnt[j] == 0) {
++j;
}
--cnt[j];
ans[i & 1] = ans[i & 1] * 10 + j;
}
return ans[0] + ans[1];
}
};
func splitNum(num int) int {
cnt := [10]int{}
n := 0
for ; num > 0; num /= 10 {
cnt[num%10]++
n++
}
ans := [2]int{}
for i, j := 0, 0; i < n; i++ {
for cnt[j] == 0 {
j++
}
cnt[j]--
ans[i&1] = ans[i&1]*10 + j
}
return ans[0] + ans[1]
}
function splitNum(num: number): number {
const cnt: number[] = Array(10).fill(0);
let n = 0;
for (; num > 0; num = Math.floor(num / 10)) {
++cnt[num % 10];
++n;
}
const ans: number[] = Array(2).fill(0);
for (let i = 0, j = 0; i < n; ++i) {
while (cnt[j] === 0) {
++j;
}
--cnt[j];
ans[i & 1] = ans[i & 1] * 10 + j;
}
return ans[0] + ans[1];
}
impl Solution {
pub fn split_num(mut num: i32) -> i32 {
let mut cnt = vec![0; 10];
let mut n = 0;
while num != 0 {
cnt[(num as usize) % 10] += 1;
num /= 10;
n += 1;
}
let mut ans = vec![0; 2];
let mut j = 0;
for i in 0..n {
while cnt[j] == 0 {
j += 1;
}
cnt[j] -= 1;
ans[i & 1] = ans[i & 1] * 10 + (j as i32);
}
ans[0] + ans[1]
}
}
我们可以将
时间复杂度
class Solution:
def splitNum(self, num: int) -> int:
s = sorted(str(num))
return int(''.join(s[::2])) + int(''.join(s[1::2]))
class Solution {
public int splitNum(int num) {
char[] s = (num + "").toCharArray();
Arrays.sort(s);
int[] ans = new int[2];
for (int i = 0; i < s.length; ++i) {
ans[i & 1] = ans[i & 1] * 10 + s[i] - '0';
}
return ans[0] + ans[1];
}
}
class Solution {
public:
int splitNum(int num) {
string s = to_string(num);
sort(s.begin(), s.end());
int ans[2]{};
for (int i = 0; i < s.size(); ++i) {
ans[i & 1] = ans[i & 1] * 10 + s[i] - '0';
}
return ans[0] + ans[1];
}
};
func splitNum(num int) int {
s := []byte(strconv.Itoa(num))
sort.Slice(s, func(i, j int) bool { return s[i] < s[j] })
ans := [2]int{}
for i, c := range s {
ans[i&1] = ans[i&1]*10 + int(c-'0')
}
return ans[0] + ans[1]
}
function splitNum(num: number): number {
const s: string[] = String(num).split('');
s.sort();
const ans: number[] = Array(2).fill(0);
for (let i = 0; i < s.length; ++i) {
ans[i & 1] = ans[i & 1] * 10 + Number(s[i]);
}
return ans[0] + ans[1];
}
impl Solution {
pub fn split_num(num: i32) -> i32 {
let mut s = num.to_string().into_bytes();
s.sort_unstable();
let mut ans = vec![0; 2];
for (i, c) in s.iter().enumerate() {
ans[i & 1] = ans[i & 1] * 10 + ((c - b'0') as i32);
}
ans[0] + ans[1]
}
}