蓝桥杯算法积累(入门)

本文深入探讨了编程中的排序算法,包括降序排列和字典序升序;介绍了散列(哈希)技术,如直接定址法、除留余数法及其在字符串哈希的应用;并讲解了递归与分治策略,通过斐波那契数列和全排列示例进行说明。内容涵盖基础算法和数据结构,适合编程初学者和进阶者学习。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一,排序

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Student{
    char id[15];
    int score;
}stu[30];

bool cmp(Student a,Student b){
    if(a.score!=b.score) return a.score>b.score;//降序
    else return strcmp(a.id,b.id)<0//字典序升序
}
int main(){
    ……
    sort(stu,stu+10,cmp);
    ……
}   

二,散列(hash)

将元素通过一个函数转换为一个整数,使得该整数可以尽量唯一地代表这个元素。

-----整数哈希------

1.直接定址法:bool hashTable[maxn]={false}\leq \leqslant

                        int  hashTable[maxn]={0}    

2.除留余数法:H(key)=key%mod  转换成不超过mod的整数。如果结果重合,用链地址法;

                         STL中的map;C++11有unordered_map;

3.二位整点哈希:0\leq x,y\leqRange

                             H(P)=x*Range+y

 -----字符串哈希-----

1.字母为A-Z,视为0-25.把字符串视为26进制数,再转换成唯一的10进制数。

int hashfunc(char s[],int len){
     int id=0;
     for(int i=0;i<len;i++){
         id=id*26+(s[i]-'A');
     }
     return id;
}

2.如果还有a-z就视为26-51

id=id*26+(s[i]-'A')+26;//判断是a-z

3.如果出现数字

同样增加进制;或者在字母转换为整数后,将末尾的数字拼接上去。

*例子:p110,给出n个字符串(3个字母),再给出m个字符串,问每个字符串在n个字符串中出现的次数。

#include<iostream>
using namespace std;
const int maxn=100;
char s[maxn][5],temp[5];
int hashTable[26*26*26+10]={0};
int hashFunc(char s[],int len){
	int id=0;
	for(int i=0;i<len;i++){
		id=id*26+(s[i]-'A');
	}
	return id;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=0;i<n;i++){
		cin>>s[i];
		int id=hashFunc(s[i],3);
		hashTable[id]++;
	}
	for(int i=0;i<m;i++){
		cin>>temp;
		int id=hashFunc(temp,3);
		cout<<hashTable[id];
	}
	return 0;
}

三,递归,分治

将原问题分解成规模小的子问题,分别解决,最后合并成解。

1.斐波那契

#include<iostream>
int F(int n){
    if(n==0||n==1) return 1;
    else return F(n-1)+F(n-2);
}
int main(){
    int n;
    cin>>n;
    cout<<F(n);
    return 0;
}

2.全排列

---------------------------------------------------------------------------------------------------------------------------------

1.数位中含有 2、0、1、9 

while(x)
    {
        if(x%10==2||x%10==0||x%10==1||x%10==9)return true;
        x/=10;
    }
    return false;

3.有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛? 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值