代码 & 题解总结
1. 题目要求
给定 n 个数,先按出现次数从多到少排序,次数相同则小数在前;再把排好的数先填满数组奇数下标,再填偶数下标,输出最终序列。
2. 代码核心四步
- 桶计数:
cnt[x]统计每个数字出现次数; - 自定义排序:
cmp优先频次降序,同频次数值升序; - 隔位填充:用 pos 从 1 开始,每次 + 2,超出长度就切换到 2,依次填充奇数位、偶数位;
- 输出答案数组 ans。
3. 复杂度
排序主导,总时间复杂度 (O(n\log n)),适配 n≤10005 的数据范围。
4. 关键考点
桶计数、sort 自定义比较函数、奇偶位置分开放置的模拟技巧。
5. 优缺点简记
优点:逻辑简单、模板通用; 缺点:固定数组有越界风险,无法适配超大数值 / 数据量。
#include<bits/stdc++.h>
using namespace std;
int a[10005], ans[10005];
int cnt[10005];
bool cmp(int x, int y) {
if(cnt[x] != cnt[y])
return cnt[x] > cnt[y];
return x < y;
}
int main() {
int n;
cin>>n;
memset(cnt,0,sizeof cnt);
for(int i=1; i<=n; i++) {
cin>>a[i];
cnt[a[i]]++;
}
sort(a+1,a+1+n,cmp);
int pos = 1;
for(int i=1;i<=n;i++){
ans[pos] = a[i];
pos += 2;
if(pos > n) pos = 2;
}
for(int i=1; i<=n; i++) {
cout<<ans[i]<<" ";
}
return 0;
}