教材:
一、模拟策略

二、字符处理
三、枚举
判断回文
bool is_plalindrome(string s){int size = s.size();for(int i = 0 ; i < size;i++){if(s[i] != s[size-1 - i]){return false;}}return true ;}
排序算法
给定两个有序数列,合并成一个新的升序数列。
中位数频率
int main(){int n, i, sum, x, a[SIZE]; // 声明变量:n(输入个数),i(循环索引),sum(累积频率),x(临时存储输入值),a[SIZE](频率数组)cin >> n; // 读取输入数据的个数 nmemset(a, 0, sizeof(a)); // 初始化数组 a 的所有元素为 0,准备计数for (i = 1; i <= n; i++) { // 循环 n 次,读取输入数据(注意:这里 i 从 1 开始,但输入值 x 不一定与 i 相关)cin >> x; // 读取一个输入值 xa[x]++; // 将 a[x] 的值加 1,统计 x 的出现频率}i = 0; sum = 0; // 重置 i 和 sum,为累加阶段做准备while (sum < (n/2 + 1)) { // 循环条件:sum 小于 (n/2 + 1)(整数除法,例如 n=5 时,5/2=2,2+1=3)i++; // 递增 i(从 1 开始,依次检查每个值)sum += a[i]; // 将 a[i] 的值累加到 sum(sum 表示从 1 到 i 的累积频率)}cout << i << endl; // 输出满足条件的 i(即中位数)return 0;}
代码功能分析
您提供的 C++ 代码是一个计算输入数据的中位数的程序。具体来说,它读取一组整数,统计每个值的出现频率,然后通过累加频率找到中位数对应的值。中位数定义为第 ⌈(n+1)/2⌉ 小的值(即当 n 为奇数时是唯一中位数,当 n 为偶数时是上中位数)。下面我将详细解释代码的功能、逻辑和注意事项。
代码整体逻辑
输入处理与初始化:读取整数 n(输入数据的个数),初始化一个数组 a 用于计数每个输入值的频率。
频率统计:读取 n 个整数,使用数组 a 记录每个值出现的次数。
中位数计算:通过累加频率数组 a,找到最小的整数 i,使得从 1 到 i 的值的累积频率首次达到或超过 n/2+1(使用整数除法)。输出这个 i,即为中位数。
归并排序
#include <bits/stdc++.h>using namespace std;int arr[9] = {0,11,22,66,77,33,55,44,88};int brr[9] ;void merge(int l , int mid , int r){// 合并为有序数列int i = l ;int k = l ;int j = mid + 1;// 从左右两边依次判断较小值进行合并while(i <= mid && j <= r){if(arr[i] < arr[j]){brr[k++] = arr[i++];}else{brr[k++] = arr[j++];}}while(i<=mid){brr[k++] = arr[i++];}while(j<=r){brr[k++] = arr[j++];}for(int i = l ;i <=r;i++){arr[i] = brr[i];}}void mergeSort(int l ,int r){// 分解原数组if(l >= r) return ;// 计算中间值int mid = (l+r)/2;mergeSort(l,mid); // 左数列 11,22,66,77mergeSort(mid+1,r); // 右数列 33,55,44,88//... 合并merge(l,mid,r);}int main(){mergeSort(1,8);for(auto x : arr) cout << x << " ";return 0;}
