当前位置: 首页 > news >正文

2022年复试题

常见算法整理:DFS、贪心、快速选择、摩尔投票与滑动窗口

在算法题中,有一些高频且实用的经典方法。本文结合几个典型问题,系统整理这些算法的核心思想与代码实现,适合作为复习与面试参考。

一、判断一个数是3的幂次方

#include<iostream> #include<cmath> using namespace std; int main(){ int n; cin >> n; if(n <= 0){ cout << "不是3的幂次方" << endl; return 0; } while(n % 3 == 0){ n /= 3; } if(n == 1){ cout << "是3的幂次方" << endl; return 0; } cout << "不是3的幂次方" << endl; return 0; }

二、贪心算法——最优解快速求解

📌 问题:用最少张数凑金额

核心思想

  • 每次优先使用最大面额

✅ 代码

#include<iostream>#include<vector>usingnamespacestd;intmain(){vector<int>denominations={100,50,20,10,5,1};vector<int>count(6,0);intamount;cin>>amount;for(inti=0;i<6;i++){count[i]=amount/denominations[i];amount%=denominations[i];}cout<<"最少张数方案:"<<endl;for(inti=0;i<6;i++){cout<<denominations[i]<<"元: "<<count[i]<<"张"<<endl;}return0;}

🧠 总结

👉 贪心适合:标准货币系统(如人民币)


三、快速选择(QuickSelect)——找最大值

📌 问题:在无序数组中找最大值

核心思想

  • 利用快排 partition
  • 每次只递归一边(剪枝)

✅ 代码

intfindMax(inta[],intl,intr){if(l==r)returna[l];inti=l,j=r;intpivot=a[l];while(i<j){while(i<j&&a[j]<=pivot)j--;while(i<j&&a[i]>=pivot)i++;if(i<j)swap(a[i],a[j]);}swap(a[l],a[i]);returnfindMax(a,l,i);}

快排的代码

#include<iostream> using namespace std; void quickSort(int a[], int l, int r){ if(l >= r) return; int i = l, j = r; int pivot = a[l]; while(i < j){ while(i < j && a[j] >= pivot) j--; while(i < j && a[i] <= pivot) i++; if(i < j) swap(a[i], a[j]); } swap(a[l], a[i]); quickSort(a, l, i - 1); quickSort(a, i + 1, r); } int main(){ int n; cin >> n; int a[n]; for(int i = 0; i < n; i++){ cin >> a[i]; } quickSort(a, 0, n - 1); for(int i = 0; i < n; i++){ cout << a[i] << " "; } return 0; }

🧠 总结

👉 本质:快排 + 剪枝 = 快速选择


四、摩尔投票法——多数元素问题

📌 问题:找出现次数 > n/2 的元素


✅ 代码

intmajorityElement(vector<int>&nums){intcandidate=0,count=0;for(intx:nums){if(count==0){candidate=x;count=1;}elseif(x==candidate){count++;}else{count--;}}count=0;for(intx:nums){if(x==candidate)count++;}returncount>nums.size()/2?candidate:-1;}

或者

#include<iostream> #include<unordered_map> using namespace std; int main(){ unordered_map<int, int> cnt; int n; cin >> n; for(int i = 0; i < n; i++){ int x; cin >> x; cnt[x]++; } for(auto& c : cnt){ if(c.second > n / 2){ cout << c.first << endl; } } return 0; }

🧠 核心思想

👉相同+1,不同-1,最终剩下的就是候选人


五、滑动窗口——连续子数组问题

📌 问题:找所有连续正整数,使和为 n


✅ 代码

inti=1,j=1,sum=0;while(i<=n/2){if(sum<n){sum+=j++;}elseif(sum>n){sum-=i++;}else{for(intk=i;k<j;k++){cout<<k<<" ";}cout<<endl;sum-=i++;}}

http://www.jsqmd.com/news/518804/

相关文章:

  • Android 12 SurfaceFlinger 事务处理全流程拆解:从 queueTransaction 到 commitTransaction 到底发生了什么?
  • Swagger+LangChain实战:5步搞定AI自动生成接口测试脚本(附完整代码)
  • Windows 11终极优化指南:用Win11Debloat让你的电脑飞起来!
  • 变压器匝数比计算
  • 基于COMSOL软件的二维激光熔覆熔池流动数值仿真研究:涵盖马兰戈尼对流等多因素驱动力分析案例复现
  • 20252901 2025-2026-2 《网络攻防实践》第一周作业
  • #MATLAB计算同轴谐振腔电场、磁场(基于FDTD算法),内部介质填充空气,采用PEC边界...
  • 基于Matlab的BP-Adaboost强分类器分类预测
  • Caffeine缓存库进阶指南:动态过期时间的3种实现方式对比
  • 现代控制理论报告:线性系统理论及MATLAB仿真下的状态观测器与状态反馈控制设计与仿真详解报告...
  • 毕业季不再“渡劫”:百考通AI全流程拆解论文炼狱的终极通关秘籍
  • 生成OFDM信号时,先得把数据映射到子载波上。128个子载波里实际用120个(掐头去尾防频谱泄露),用16QAM调制的话代码大概长这样
  • 论文炼狱通关秘籍:百考通AI如何用“人机协同”破局毕业季核心痛点
  • “Comsol中变压器绝缘油流注放电仿真及MIT飘逸扩散模型建立”的详细资料及学习笔记
  • 116基于Springcloud的智能社区服务系统-springboot+vue
  • 用Arduino串口绘图仪观察三角函数:手把手教你实现动态波形显示
  • Matlab遗传优化算法求解生鲜配送问题的路径优化与时间窗管理:考虑新鲜度与货损成本的解决方案...
  • 毕业季论文求生指南:如何用百考通AI一站式高效通关?
  • 基本matlab的最小二乘估计递推算法,生成M 序列,对参数估计值进行辨识,输出估计误差结果...
  • 百考通:积累可落地的项目经验,为求职与职业发展打下坚实基础
  • 光伏锂电池储能功率协调控制系统仿真探索
  • 基于华为eNSP的园区网防火墙高可靠与安全策略实战
  • LLC谐振变换器变频与移相混合控制 仿真模型采用混合控制,控制策略为:当输入电压较低时,采用变频控制
  • 手把手教你用CS5523替代IT6151:MIPI转EDP信号转换芯片的完整配置指南
  • 嵌入式开发避坑指南:如何快速定位Hard_Fault_Handler错误(附内存越界排查技巧)
  • Java笔记 —— 泛型
  • ABAQUS纤维复合材料热固化仿真:子粘弹性模型与内附CAE文件
  • 三电平逆变器实战:从SVPWM调制到中点平衡的硬核玩法
  • 从‘靶场‘到‘实战‘:把Pikachu漏洞环境搬上云服务器(阿里云/腾讯云实操)
  • 基于A*算法的往返式全覆盖路径规划的改进算法及MATLAB实现代码