2022年复试题

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

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

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

c++ 复制代码
#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;
}

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

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

核心思想

  • 每次优先使用最大面额

✅ 代码

cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;

int main(){
    vector<int> denominations = {100, 50, 20, 10, 5, 1};
    vector<int> count(6, 0);

    int amount;
    cin >> amount;

    for(int i = 0; i < 6; i++){
        count[i] = amount / denominations[i];
        amount %= denominations[i];
    }

    cout << "最少张数方案:" << endl;
    for(int i = 0; i < 6; i++){
        cout << denominations[i] << "元: " << count[i] << "张" << endl;
    }

    return 0;
}

🧠 总结

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


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

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

核心思想

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

✅ 代码

cpp 复制代码
int findMax(int a[], int l, int r){
    if(l == r) return a[l];

    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]);

    return findMax(a, l, i);
}

快排的代码

c++ 复制代码
#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 的元素


✅ 代码

cpp 复制代码
int majorityElement(vector<int>& nums) {
    int candidate = 0, count = 0;

    for(int x : nums){
        if(count == 0){
            candidate = x;
            count = 1;
        }else if(x == candidate){
            count++;
        }else{
            count--;
        }
    }

    count = 0;
    for(int x : nums){
        if(x == candidate) count++;
    }

    return count > nums.size()/2 ? candidate : -1;
}

或者

c++ 复制代码
#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


✅ 代码

cpp 复制代码
int i = 1, j = 1, sum = 0;

while(i <= n/2){
    if(sum < n){
        sum += j++;
    }else if(sum > n){
        sum -= i++;
    }else{
        for(int k = i; k < j; k++){
            cout << k << " ";
        }
        cout << endl;
        sum -= i++;
    }
}

相关推荐
岑梓铭2 小时前
《考研408数据结构》第八章(排序)复习笔记
数据结构·笔记
青少儿编程课堂2 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
在所不辞兄3 小时前
为什么在新能源汽车电驱与热管理开发中,AI驱动的数字孪生和数据驱动仿真正在部分替代对物理台架与实车标定的依赖?
人工智能·深度学习·神经网络·算法·机器学习
I_belong_to_jesus13 小时前
C++关于分支预测的优化1
开发语言·c++·算法
Code_Solitude20 小时前
C语言动态内存 + 柔性数组 + 数组名退化
c语言·算法·柔性数组
上海潭龙东海科技有限公司20 小时前
客运站管控之动态孪生技术方案(新增一屏管控模块
数据仓库·人工智能·算法·重构·动态规划
YLCHUP1 天前
【思维&图论建模】题解:债权(debt)_图论_建模_思路转化_思维题目_C++算法竞赛
c++·笔记·算法·数学建模·贪心算法·深度优先·图论
思麟呀1 天前
背包DP(01背包+完全背包)
c++·算法
笑容掩饰我的失落1 天前
区块链从小白到精通(七):Solidity 语法精讲——数据类型、函数、修饰器与事件
算法·区块链·php·智能合约·哈希算法