科大讯飞笔试 科大讯飞笔试题 0330
笔试时间:2025年03月30日
历史笔试传送门:
第一题
题目:提取中位数
给出一个长度为 n 的序列 a1,a2,a3⋯a**n,请你按照以下规则输出序列的中位数:如果序列的大小为奇数,则中位数是按照升序排序后中间的数字。如果序列的大小为偶数:按照升序排序后,中间的两个数字 x=y时,输出任意一个即可;按照升序排序后,中间的两个数字 x\=y时,输出 min(x,y),即 x和 y中较小的那个数。当输出中位数 mid_x时,该中位数 mid_x从序列 a中消失,再输出消失后的序列 a′ 中位数。重复上述步骤,直至全部将序列 a全部输出。
输入描述
第一行输入一个正整数 n(1≤n≤105) 代表序列长度。
第二行输入 n个正整数 a1,a2,⋯,a^n (1≤a^i≤109) 代表序列元素。
输出描述
在一行上输出 n个整数代表依次提取出的中位数。
样例输入
4
1 9 8 5
样例输出
5 8 1 9
参考题解
要动态提取中位数并维护剩余序列的中位数。核心思路是预先排序数组,然后通过双指针模拟动态删除中位数的过程。排序预处理首先对数组进行排序,便于后续快速定位中位数。奇偶分类处理奇数长度:直接取中间元素作为第一个中位数,剩余元素分为左右两部分,用双指针交替取元素。偶数长度:取中间左侧较小元素作为第一个中位数,随后左右指针分别向两侧扩展,交替取元素。双指针模拟删除利用左右指针动态维护剩余元素的边界,每次取完一个中位数后,指针向两侧移动以模拟删除操作。
C++:[此代码未进行大量数据的测试,仅供参考]
#include <iostream> #include <vector> #include <algorithm> using namespace std; void extract_medians() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; ++i) { cin >> nums[i]; } sort(nums.begin(), nums.end()); vector<int> result; if (n % 2 == 1) { // Odd length int mid = n / 2; result.push_back(nums[mid]); int left = mid - 1; int right = mid + 1; for (int i = 0; i < (n - 1) / 2; ++i) { result.push_back(nums[left]); left--; result.push_back(nums[right]); right++; } } else { // Even length int left = (n / 2) - 1; int right = n / 2; for (int i = 0; i < n / 2; ++i) { result.push_back(nums[left]); left--; result.push_back(nums[right]); right++; } } for (int i = 0; i < result.size(); ++i) { cout << result[i] << " "; } cout << endl; } int main() { extract_medians(); return 0; }
Java:[此代码未进行大量数据的测试,仅供参考]
import java.util.*; public class Main { public static void extractMedians() { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int[] nums = new int[n]; for (int i = 0; i < n; ++i) { nums[i] = scanner.nextInt(); } Arrays.sort(nums); List<Integer> result = new ArrayList<>(); if (n % 2 == 1) { // Odd length int mid = n / 2; result.add(nums[mid]); int left = mid - 1; int right = mid + 1; for (int i = 0; i < (n - 1) / 2; ++i) { result.add(nums[left]); left--; result.add(nums[right]); right++; } } else { // Even length int left = (n / 2) - 1; int right = n / 2; for (int i = 0; i < n / 2; ++i) { result.add(nums[left]); left--; result.add(nums[right]); right++; } } for (int num : result) { System.out.print(num + " "); } System.out.println(); } public static void main(String[] args) { extractMedians(); } }
Python:[此代码未进行大量数据的测试,仅供参考]
def extract_medi
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
2025打怪升级记录,大厂笔试合集 C++, Java, Python等多种语言做法集合指南