- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
java解法
- 解题思路
- 题目要求对卡片按出现次数进行重新排列,排序规则如下:
出现次数为 4 的卡片:按卡片值降序排列。
出现次数为 3 的卡片:按卡片值升序排列,并尽量与出现次数为 2 的卡片配对。
出现次数为 2 的卡片:按卡片值升序排列。
出现次数为 1 的卡片:按卡片值降序排列。
关键步骤:
统计每张卡片的出现次数:使用 Map 来统计每个卡片的出现次数。
分类:将卡片按出现次数分类为 1 次、2 次、3 次和 4 次。
排序:
按照题目要求,对每个分类的卡片进行排序:
对 4 次出现的卡片按出现次数和卡片值降序排序。
对 3 次和 2 次出现的卡片按升序排序。
对 1 次出现的卡片按降序排序。
拼接结果:根据排序后的卡片,将它们按顺序加入最终结果列表。
在处理 3 次出现的卡片时,优先配对 2 次出现的卡片或单张卡片。
import java.util.*;
import java.util.stream.Collectors;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
List<Integer> numbers = new ArrayList<>();
while (sc.hasNextInt()) {
numbers.add(sc.nextInt());
}
System.out.println(processCards(numbers));
}
public static String processCards(List<Integer> numbers) {
Map<Integer, Integer> count = new HashMap<>();
for (int num : numbers) {
count.put(num, count.getOrDefault(num, 0) + 1);
}
Set<Integer> singles = new HashSet<>();
Set<Integer> pairs = new HashSet<>();
Set<Integer> triples = new HashSet<>();
Set<Integer> quads = new HashSet<>();
for (Map.Entry<Integer, Integer> entry : count.entrySet()) {
int num = entry.getKey();
int freq = entry.getValue();
if (freq == 1) {
singles.add(num);
} else if (freq == 2) {
pairs.add(num);
} else if (freq == 3) {
triples.add(num);
} else {
quads.add(num);
}
}
List<Integer> result = new ArrayList<>();
List<Integer> quadsList = new ArrayList<>(quads);
quadsList.sort((a, b) -> count.get(b) != count.get(a) ? count.get(b) - count.get(a) : b - a);
for (int q : quadsList) {
for (int i = 0; i < count.get(q); i++) {
result.add(q);
}
}
List<Integer> triplesList = new ArrayList<>(triples);
List<Integer> pairsList = new ArrayList<>(pairs);
Collections.sort(triplesList);
Collections.sort(pairsList);
while (!triplesList.isEmpty()) {
int t = triplesList.remove(triplesList.size() - 1);
result.add(t);
result.add(t);
result.add(t);
if (!triplesList.isEmpty() && (pairsList.isEmpty() || triplesList.get(triplesList.size() - 1) > pairsList.get(pairsList.size() - 1))) {
int leftover = triplesList.remove(triplesList.size() - 1);
singles.add(leftover);
result.add(leftover);
result.add(leftover);
} else if (!pairsList.isEmpty()) {
int p = pairsList.remove(pairsList.size() - 1);
result.add(p);
result.add(p);
}
}
while (!pairsList.isEmpty()) {
int p = pairsList.remove(pairsList.size() - 1);
result.add(p);
result.add(p);
}
List<Integer> singlesList = new ArrayList<>(singles);
singlesList.sort(Collections.reverseOrder());
result.addAll(singlesList);
return result.stream().map(String::valueOf).collect(Collectors.joining(" "));
}
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
C++解法
- 解题思路
- 本题要求对一组卡片(整数)进行重新排序,按照卡片出现次数的规律进行排列。具体要求如下:
出现次数为 4 的卡片:按卡片值降序排列。
出现次数为 3 的卡片:按卡片值升序排列,并尽量与出现次数为 2 的卡片配对。
出现次数为 2 的卡片:按卡片值升序排列。
出现次数为 1 的卡片:按卡片值降序排列。
关键步骤:
统计每个卡片的出现次数:使用 map 来记录每个卡片的出现次数。
分类:将卡片按照出现次数分为 1 次、2 次、3 次和 4 次。
排序:
对 4 次出现的卡片按卡片值降序排列。
对 3 次和 2 次出现的卡片按卡片值升序排列。
对 1 次出现的卡片按降序排列。
拼接结果:根据排序后的卡片,将它们按顺序加入最终结果列表。
在处理 3 次出现的卡片时,优先配对 2 次的卡片或单张卡片。
#include
#include
#include
#include
using namespace std;
int main() {
vector<int> ns;
int x;
while (cin >> x) {
ns.push_back(x);
}
map<int, int> cnt;
for (int n : ns) {
cnt[n]++;
}
vector<int> sng, prs, trs, bms;
for (auto& e : cnt) {
int v = e.first;
int c = e.second;
if (c == 1) {
sng.push_back(v);
} else if (c == 2) {
prs.push_back(v);
} else if (c == 3) {
trs.push_back(v);
} else {
bms.push_back(v);
}
}
vector<int> res;
sort(bms.begin(), bms.end(), [&](int a, int b) {
if (cnt[a] != cnt[b]) return cnt[a] > cnt[b];
return a > b;
});
for (int b : bms) {
for (int i = 0; i < cnt[b]; ++i) {
res.push_back(b);
}
}
sort(trs.begin(), trs.end());
sort(prs.begin(), prs.end());
while (!trs.empty()) {
int t = trs.back();
trs.pop_back();
res.push_back(t);
res.push_back(t);
res.push_back(t);
if (!trs.empty() && (prs.empty() || trs.back() > prs.back())) {
sng.push_back(trs.back());
res.push_back(trs.back());
res.push_back(trs.back());
trs.pop_back();
} else if (!prs.empty()) {
res.push_back(prs.back());
res.push_back(prs.back());
prs.pop_back();
}
}
while (!prs.empty()) {
res.push_back(prs.back());
res.push_back(prs.back());
prs.pop_back();
}
sort(sng.begin(), sng.end(), greater<int>());
for (int s : sng) {
res.push_back(s);
}
for (int i = 0; i < res.size(); ++i) {
if (i > 0) cout << " ";
cout << res[i];
}
cout << endl;
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
C解法
更新中
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
JS解法
出现次数为 4 次的卡片:按照卡片值降序排列。
出现次数为 3 次的卡片:按照卡片值升序排列,并尽量与出现次数为 2 次的卡片配对。
出现次数为 2 次的卡片:按照卡片值升序排列。
出现次数为 1 次的卡片:按照卡片值降序排列。
关键步骤:
统计每个卡片的出现次数:使用对象(cnt)来记录每个卡片的出现次数。
分类:将卡片按照出现次数分为 1 次、2 次、3 次和 4 次。
排序:
对 4 次出现的卡片按卡片值降序排列。
对 3 次和 2 次出现的卡片按卡片值升序排列。
对 1 次出现的卡片按降序排列。
拼接结果:根据排序后的卡片,将它们按顺序加入最终结果列表。
在处理 3 次出现的卡片时,优先配对 2 次的卡片或单张卡片。
输出结果:最后将拼接后的卡片输出。
const rl = require("readline").createInterface({ input: process.stdin });
const it = rl[Symbol.asyncIterator]();
const rdl = async () => (await it.next()).value;
void (async function () {
const nums = (await rdl()).split(" ").map(Number);
const cnt = {};
nums.forEach((n) => (cnt[n] = (cnt[n] || 0) + 1));
const sng = [], prs = [], tpl = [], bmb = [];
for (const val in cnt) {
const c = cnt[val];
const v = parseInt(val);
if (c === 1) sng.push(v);
else if (c === 2) prs.push(v);
else if (c === 3) tpl.push(v);
else bmb.push(v);
}
const res = [];
bmb.sort((x, y) => (cnt[x] !== cnt[y] ? cnt[y] - cnt[x] : y - x));
bmb.forEach((v) => res.push(...Array(cnt[v]).fill(v)));
tpl.sort((x, y) => x - y);
prs.sort((x, y) => x - y);
while (tpl.length > 0) {
res.push(...Array(3).fill(tpl.pop()));
if (tpl.length > 0 && (prs.length === 0 || tpl.at(-1) > prs.at(-1))) {
sng.push(tpl.at(-1));
res.push(...Array(2).fill(tpl.pop()));
} else if (prs.length > 0) {
res.push(...Array(2).fill(prs.pop()));
}
}
while (prs.length > 0) {
res.push(...Array(2).fill(prs.pop()));
}
sng.sort((x, y) => y - x);
res.push(...sng);
console.log(res.join(" "));
})();
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
注意:
如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。
解题不易,如对您有帮助,欢迎点赞/收藏
评论记录:
回复评论: